1

我有一张叫朋友的桌子和一张桌子照片。我正在尝试查询朋友照片或拥有朋友照片的用户。我想我需要为朋友表上的内部联接起别名,但不确定

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 子句或其他东西内部加入一个别名表,但无法弄清楚。

4

3 回答 3

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)
于 2012-12-12T10:15:46.627 回答
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))
于 2012-12-12T10:49:04.380 回答
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
于 2012-12-12T10:15:22.467 回答