我觉得有更好的方法可以做到这一点。我主要只是问我做的是对的,还是有更好的方法。
观察这些表:
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)。
答案 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