查询“on”子句不限制join?

时间:2013-08-17 09:42:01

标签: mysql sql join

我有如下查询,它的目的是

  

将所有提交内容的ID返回到比赛2中,包括他们被阅读的次数。

它正在做的一切都很好,除了它还从所有其他比赛返回的行;为什么不只是加入`competition_id` = 2

SELECT 
    `c`.`competition_id`,
    `c`.`submission_id`,
    COUNT(
      `submission_reads`.`submission_id`
    ) `reads` 
  FROM
    `submission_reads` 
    RIGHT JOIN `competition_submissions` c 
      ON `c`.`submission_id` = `submission_reads`.`submission_id` 
      AND c.top_round = 1 
      AND c.`competition_id` = 2 
  GROUP BY `c`.`submission_id`

1 个答案:

答案 0 :(得分:3)

RIGHT联接中,您可以从右侧的表中获取所有行; ON子句限制左侧表中的匹配行,即submission_reads表。如果您想限制competition_submissions行,则需要将联接从RIGHT更改为LEFT

  

评论:“我想要competition_submissions表中的所有行,无论它是否在submission_reads中都有一个条目

然后你需要使c.competition_id = 2子句成为WHERE子句的一部分,因为你希望它过滤外连接中“main”表的行:

SELECT 
    `c`.`competition_id`,
    `c`.`submission_id`,
    COUNT(
      `submission_reads`.`submission_id`
    ) `reads` 
  FROM
     `competition_submissions` c 
    LEFT JOIN `submission_reads` r
      ON `c`.`submission_id` = `r`.`submission_id` 
      AND `c`.top_round = 1 
  WHERE `c`.`competition_id` = 2 
  GROUP BY `c`.`submission_id`