【问题标题】:Select rows with Left Outer Join and condition - MySQL选择具有左外连接和条件的行 - MySQL
【发布时间】:2014-12-20 10:46:01
【问题描述】:
PEOPLE        PEOPLE_FAVS
id            user_id  fav_id
------        -------  ----------
1             1        1
2             1        2
3             1        5
4             2        1
5             2        2
6

我有两张表 PEOPLE 和 PEOPLE_FAVS,我正在尝试获取所有没有收藏数字“5”的人,所以它应该返回

PEOPLE
id
------
2
3
4
5
6

我正在尝试这个查询:

SELECT `people`.`id`
FROM `people`
LEFT OUTER JOIN `people_favs` ON (`people_favs`.`user_id` = `people`.`id`)
WHERE (`people_favs`.`fav_id` != 5)
GROUP BY `people`.`id`

这是一个 SQL Fiddle:http://sqlfiddle.com/#!2/4102b8/3

【问题讨论】:

  • GROUP BY 有什么用?
  • 把它分组,不要让2的重复
  • 但是除了用户 1 之外没有人喜欢数字 5 !?!? - 并且 GROUP BY 旨在为聚合函数提供聚合。
  • 那你有什么建议?
  • 完全正确。 完全正确;-)

标签: mysql join conditional-statements


【解决方案1】:
SELECT p.*
  FROM people p
  LEFT
  JOIN people_favs pf
    ON pf.user_id = p.id
   AND pf.fav_id = 5
 WHERE pf.fav_id IS NULL

http://sqlfiddle.com/#!2/665b6/1

【讨论】:

    【解决方案2】:

    您是否尝试过简单地这样做:

    SELECT DISTINCT `people`.`id`
    FROM `people`
    JOIN `people_favs` ON (`people_favs`.`user_id` = `people`.`id`)
    WHERE (`people_favs`.`fav_id` <> 5)
    GROUP BY `people`.`id`
    

    【讨论】:

      【解决方案3】:

      您实际上不需要使用外连接。当您想要查看一个表中的所有行时,通常使用外部连接,而不管它们与另一个表的条件如何。虽然它可以在这种情况下工作(如草莓的示例所示),但您可以使用 NOT EXISTS 运算符来检查没有 5 作为收藏夹的 id。

      据我所知,几乎没有性能差异,但此查询要短一些。我也觉得这更合乎逻辑,因为您并没有真正加入信息。不过,这只是个人意见/想法。

      试试这个:

      SELECT id
      FROM people 
      WHERE NOT EXISTS(SELECT id FROM people_favs WHERE fav_id = 5 AND user_id = id);
      

      SQLFiddle 使用您的数据的示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 2018-01-16
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 1970-01-01
        相关资源
        最近更新 更多