列包含其他表列的值

时间:2017-09-21 12:57:33

标签: mysql sql algorithm join

我有一个表 Data ,如下所示:

Name    Address     Country
A       PO 123 AF   Afghanistan
B       PO 23 AFG   AF
C       PO IND df1  AFG
D       PO 12345    USA

我想获取AddressCountry不同的所有记录。在上面的例子中,我需要记录3(Name = C),因为Address有“IND”而Country是“AFG”。

注意:

  1. Country可以是ISO-2,ISO-3或描述(例如“IN”,“IND”或“India”)
  2. Address可能包含也可能不包含国家/地区名称 - 如果包含,则可以是ISO-2,ISO-3或说明。
  3. Country详情存储在单独的国家/地区表格中,并将所有国家/地区存储为 -

    Id | Iso2 | Iso3 | Description
    
  4. 我确定,

    1. 首先,我们需要检查地址是否包含任何国家/地区的ISO-2,ISO-3或说明 - 地址是自由文本,国家/地区可以是文本或国家/地区中的任何位置,甚至可能不会出现在地址中 - 在这种情况下,我们需要跳过这些记录。
    2. 然后,如果地址有国家/地区详细信息,我们需要检查它是否与Country列不同(可能还包含ISO-2,ISO-3或Description)
    3. 提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你想在你的结果中使用USA吗?

SQL Fiddle

MySQL 5.6架构设置

查询1

select * 
from Data
inner join country 
    on (
        Data.country = country.Iso2
        or Data.country = country.Iso3
        or Data.country = country.Description
        )
Where 

    Data.Address NOT like concat('%',country.Iso2,'%')
    and Data.Address NOT like concat('%',country.Iso3,'%')
    and Data.Address NOT like concat('%',country.Description,'%')

<强> Results

| Name |    Address | Country | Id | Iso2 | Iso3 |              Description |
|------|------------|---------|----|------|------|--------------------------|
|    C | PO IND df1 |     AFG |  1 |   AF |  AFG |              Afghanistan |
|    D |   PO 12345 |     USA |  3 |   US |  USA | united states of america |

查询2

select Data.*, country.*
from Data
inner join country 
    on (
        Data.country = country.Iso2
        or Data.country = country.Iso3
        or Data.country = country.Description
        )
left join country ca
    on (
        Data.Address like concat('%',ca.Iso2,'%')
        or Data.Address like concat('%',ca.Iso3,'%')
        or Data.Address like concat('%',ca.Description,'%')
        )
Where 
    Data.Address NOT like concat('%',country.Iso2,'%')
    and Data.Address NOT like concat('%',country.Iso3,'%')
    and Data.Address NOT like concat('%',country.Description,'%')
    and ca.id IS NOT NULL

<强> Results

| Name |    Address | Country | Id | Iso2 | Iso3 | Description |
|------|------------|---------|----|------|------|-------------|
|    C | PO IND df1 |     AFG |  1 |   AF |  AFG | Afghanistan |