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 に答える