1

我有如下查询,它的意思是

返回所有提交到竞赛 2 的 id,包括它们被阅读的次数。

它做的一切都很好,除了它也从所有其他比赛中返回行;为什么不只加入哪里`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`
4

1 回答 1

3

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

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

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

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`
于 2013-08-17T09:45:04.970 回答