Mysql 如何使用“从其他表联接”从一个具有多个值的列中选择数据?
我有两张桌子旅行者和城市 城市表:Mysql 如何使用“从其他表联接”从一个具有多个值的列中选择数据?,mysql,sql,join,Mysql,Sql,Join,我有两张桌子旅行者和城市 城市表: City_id City_name 1 Delhi 2 Mumbai 3 Newyork 4 Sydney 用户表: traveller_name traveled_city harry 1,2 peter 2,3,4 john 2,4 如何把这样的旅行者旅
City_id City_name
1 Delhi
2 Mumbai
3 Newyork
4 Sydney
用户表:
traveller_name traveled_city
harry 1,2
peter 2,3,4
john 2,4
如何把这样的旅行者旅行过的城市带回来
traveller_name travelled_city
harry Delhi , Mumbai
选择traveller.Traveler\u name、GROUP\u CONCAT(城市.city\u name) 来自旅行者 city.city\u id=traveller.traveled\u city\u id上的内部连接城市
按Traveler分组。Traveler\u name您的数据库架构未规范化。指示字段中需要有原子值。同样考虑到其他正常形式,您需要有单独的
User
表和UserCity
表
如果规范化表,那么查询将变得更简单
用户表
--------+----------
| UserId UserName |
--------+----------
| 1 | Harry |
| 2 | Peter |
-------------------
用户城市表(它是桥接表)
现在,您可以轻松地查询
SELECT u.UserName as traveller_name, group_concat(c.cityname,',') as travelled_city
FROM User as u
JOIN UserCity as uc
ON u.UserId = uc.UserId
JOIN City as c
ON uc.CityId = c.CityId
GROUP BY u.UserName
用户表中城市的值是否用逗号分隔?或者一个用户将有多个不同旅行城市的记录?您的数据似乎已非标准化。如果你发现自己在一个单独的字段中存储了多个项目,就像在旅游城市一样,那么是时候进行重新设计了。您需要一个带有外键的子表返回到用户表。在继续您的项目之前,您可能需要进一步研究关系数据库设计。这可能会有所帮助:我是ADyson的。这是一个糟糕的数据模型。您并没有真正使用关系数据库系统,正如您应该做的那样。将您的结构更改为
city(city\u id,city\u name)
,user(user\u id,user\u name)
,city\u user(city\u id,user\u id)
@草莓请给我链接city.city\u id=traveller.traveled\u city
将永远不会为真,因为traveled\u city包含多个id…OP的数据已非标准化。DB的设计需要修改才能有一个简洁的解决方案。@ADyson是的。它只提供一个城市名称,这就是为什么我们使用group_concat,它提供逗号分隔的字符串
SELECT u.UserName as traveller_name, group_concat(c.cityname,',') as travelled_city
FROM User as u
JOIN UserCity as uc
ON u.UserId = uc.UserId
JOIN City as c
ON uc.CityId = c.CityId
GROUP BY u.UserName