我有一个表 Data
如下:
Name Address Country
A PO 123 AF Afghanistan
B PO 23 AFG AF
C PO IND df1 AFG
D PO 12345 USA
我想获取所有 Address
与 Country
不同的记录。在上面的例子中,我需要记录 3 (Name
= C),因为 Address
有“IND”,Country
是“AFG”。
注意:
Country
可以是 ISO-2、ISO-3 或描述(例如“IN”、“IND”或“India”)Address
可能包含也可能不包含国家/地区名称 - 如果包含,则可能是 ISO-2、ISO-3 或说明。Country
详细信息存储在单独的 Country 表中,所有国家都存储为 -Id | Iso2 | Iso3 | Description
我确定,
- 首先,我们需要检查地址是否包含 ISO-2、ISO-3 或任何国家/地区的描述 - 地址是自由文本,国家/地区可以是文本中的任何位置,或者国家/地区甚至可能不存在于地址中 - 在这种情况下,我们需要跳过这些记录。
- 然后,如果 Address 有国家详细信息,我们需要检查它是否与国家列(同样可能包含 ISO-2、ISO-3 或描述)不同
在此先感谢您的帮助。
最佳答案
您是否希望在结果中包含美国行?
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 |
关于mysql - 列包含来自其他表列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46344565/