选择与一个项目关联的多个项目

时间:2011-12-27 10:00:52

标签: mysql select schema

我觉得有更好的方法可以做到这一点。我主要只是问我做的是对的,还是有更好的方法。

观察这些表:

Users
id | name
---+---------
 1 | Andrew
 2 | Greg

Images
id | userid | url
---+--------+-------
 1 |   1    |  img/foo.jpg
 2 |   2    |  img/bar.jpg
 3 |   2    |  img/baz.jpg
 4 |   1    |  img/qux.jpg

如果Users表具有引用Images的单个外键,则每个用户只能与单个图像关联。但是,我想允许每个用户与任意数量的图像相关联,因此将用户外键放在图像中。

如果用户对另一个表中存储的数据有一个外键,我理解如何使用JOIN。但是,在这种情况下,还有另一个表,其中包含许多与我感兴趣的用户相关联的外键。如何构建一个SELECT查询,该查询将检索除用户之外的所有与用户相关的图像。在一个SELECT查询中与用户关联的数据(用户类型,电话号码,等等等等[我知道如何做到这一点])?

或者,有更好的方法吗?

编辑1:

例如,如果您选择id = 1的用户,那么它将返回第一行Users和第一行和最后一行Images(因为这些行的userid = 1)。

2 个答案:

答案 0 :(得分:2)

如果您不希望多行具有相同(用户)数据,您可以按用户分组并使用GROUP_CONCAT()函数收集一列中的所有网址:

SELECT u.*
     , GROUP_CONCAT(i.URL)
FROM users u
  LEFT JOIN Images i 
    ON u.ID = i.userID
WHERE u.ID = 1
GROUP BY u.ID

或使用2个查询:

SELECT u.*
FROM users u
WHERE u.ID = 1

SELECT i.URL
FROM Images i 
WHERE i.userID = 1

答案 1 :(得分:1)

所以...如果它是1-1或1-M,则连接是相同的。差异发挥作用的时候是你想要一个值在另一个值中不存在的情况,或者你想要所有两者都不管是否找到匹配。我最喜欢的一个解释sql join逻辑的站点是coding horror

Select U.Name, I.URL
FROM users U 
INNER JOIN Images I ON U.ID = I.userID
Where U.ID = 1

将返回

U.Name  I.URL
Andrew  img/foo.jpg
Andrew  img/Qux.jpg

修改的 所以你要追求的是A

U.Name  I.URL
Andrew  img/foo.jpg
        img/Qux.jpg   

或B?

U.Name  I.URL
Andrew  img/foo.jp, img/Qux.jpg