简体   繁体   English

多对多选择

[英]Many-to-Many Select

I have 3 tables: 我有3张桌子:

users : 用户

id  name
1   Jack
2   Vasya
3   John
4   Robert
5   Dmitry
6   Dylan

cities : 城市

id  city
1   London
2   Kyiv
3   New-York
4   Chicago
5   Moscow
6   Dubai

users_cities : users_cities

user_id city_id
1       1
3       1
5       6
2       3
4       5
6       6

I need to select users with Jack in London by Jack's id(users.id = 1) or users in Dubai with Dmitry(users.id = 5) using JOIN. 我需要使用JOIN通过Jack的id(users.id = 1)选择伦敦的Jack用户或在Dmitry(users.id = 5)迪拜的用户。 How could I do it? 我该怎么办?

What I have tried: 我试过的

SELECT `u`.`username`, `uc`.`city_id` FROM `users` as `u`
    INNER JOIN `users_cities` as `uc` ON `u`.`id` = `uc`.`user_id`
    INNER JOIN `users_cities` as `uc1` ON `uc1`.`city_id` = `uc`.`city_id`
WHERE `u`.`id` = 1

It returns: 它返回:

username    city_id
Jack        1
Jack        1

You're so very close. 你好亲近 You only need to JOIN to user_cities once for your query. 您只需要将JOINuser_cities一次即可。 Then use the WHERE clause to determine the users or cities you wish to filter on. 然后使用WHERE子句确定要过滤的用户或城市。

If you want the city name in the result set then make an additional join from user_cities to cities . 如果要在结果集中输入城市名称,则可以将user_citiescities

As you are joining twice on the same result set ( user_cities ) you are effectively querying that result twice, which is why you are getting duplicate 'Jacks'. 当您在同一个结果集( user_cities )上加入两次时,您实际上在查询该结果两次,这就是为什么您得到重复的“夹克”的原因。

If this is not exactly what you need, then adjust your WHERE clause to determine how you would like to filter the result set. 如果这不是您所需要的,请调整WHERE子句,以确定您希望如何过滤结果集。

SELECT 
  u.username, 
  c.city 
FROM 
  users as u
  INNER JOIN users_cities as uc ON u.id = uc.user_id
  INNER JOIN cities as c ON uc.city_id = c.id
WHERE 
  u.id = 1 -- Jack
  OR u.id = 5 -- Dimitry

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM