Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用“从其他表联接”从一个具有多个值的列中选择数据?_Mysql_Sql_Join - Fatal编程技术网

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