如何在没有distinct或union的情况下更正查询朋友表中的用户和朋友数据

时间:2012-12-12 10:01:10

标签: mysql sql join inner-join

我有一张名为朋友的桌子和一张桌子照片。我正在尝试查询朋友的照片或有朋友照片的用户。我想我需要在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子句内部加入一个别名表或其他东西,但无法解决它。

3 个答案:

答案 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