我有一张名为朋友的桌子和一张桌子照片。我正在尝试查询朋友的照片或有朋友照片的用户。我想我需要在friends表上为内联接设置别名但不确定
Friends Table
user_id int
friend_id int
[other attribute field]
Photos Table
id int
user_id int
[other attribute field]
例如,如果我想查询我要运行的朋友照片
SELECT `photos`.`id` FROM `photos` LEFT JOIN `friends` ON (`friends`.`friend_id` = `photos`.`user_id`) WHERE `friends`.`user_id` = 1
或者,如果我只想查询用户表id
SELECT `photos`.`id` FROM `photos` WHERE `photos`.`user_id` = 1
问题是当我尝试将两者都放在像
这样的结果集中时SELECT `photos`.`id`
FROM `photos`
LEFT JOIN `friends` ON ( `friends`.`friend_id` = `photos`.`user_id` )
WHERE `friends`.`user_id` =1
OR `photos`.`user_id` =1
LIMIT 0 , 30
由于左边的连接显然得到了错误的结果,我得到了每个朋友的结果
我认为我需要为OR子句内部加入一个别名表或其他东西,但无法解决它。
答案 0 :(得分:2)
如果只是在第一次查询时使用UNION,那该怎么办:
SELECT `photos`.`id`
FROM `photos`
LEFT JOIN `friends` ON (`friends`.`friend_id` = `photos`.`user_id`)
WHERE `friends`.`user_id` = 1
union all
SELECT `photos`.`id` FROM `photos` WHERE `photos`.`user_id` = 1
如果你不想使用UNION那么
SELECT `photos`.`id`
FROM `photos` where `photos`.`user_id`=1
or `photos`.`user_id`
in (select `friends`.`friend_id` from `friends`
where `friends`.`user_id` = 1)
答案 1 :(得分:1)
我认为工会是解决这个问题的最佳方法。
或者您可以尝试将子查询与'OR'
一起使用SELECT photos.id FROM photos WHERE
(photos.user_id = 1) or
(photos.user_id in (select friends.friend_id from friends where friends.user_id=1))
答案 2 :(得分:0)
对于您展示的内容,您根本不需要JOIN
。由于photos
表已包含用户ID,因此您所显示的内容中不需要friends
表。只需直接查询photos
即可获取特定用户的照片。
也许你真的想要一些与众不同的东西,比如只有当某人真的是朋友时才会回复一张照片。在这种情况下,您需要inner join
而不是左连接,您可以这样做:
SELECT `photos`.`id`
FROM `photos`
INNER JOIN `friends` ON
`friends`.`friend_id` = `photos`.`user_id` AND
`friends`.`user_id` =1
LIMIT 0 , 30
如果您想要返回ID为1的朋友的照片,以及用户ID 2的照片,无论该人是否是朋友,请执行以下操作:
SELECT `photos`.`id`
FROM `photos`
LEFT JOIN `friends` ON
`friends`.`friend_id` = `photos`.`user_id` AND
`friends`.`user_id` = 1
WHERE
`friends`.`friend_id` IS NOT NULL OR
`photos`.`user_id` = 2
LIMIT 0 , 30