2013-08-17 74 views
1

我有如下的查詢,這是什麼意思做的是查詢「on」子句不限制連接?

所有提交的返回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` 
+0

move competition_id = 2 move where clause – Akhil

回答

3

RIGHT加入,你從右邊的表中的所有行; ON子句限制了左側表中的匹配行,即submission_reads表。如果要限制行數competition_submissions,則需要將連接從RIGHT更改爲LEFT

評論:「我想從competition_submissions表中的所有行,無論它是否已在submission_reads的條目」

然後,你需要做的WHERE條款c.competition_id = 2一部分,因爲你希望它過濾外連接中「主」表的行:

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` 
+0

AH我看到了,所以如果我想要'competition_submissions'表中的所有行,而不管它是否在'submission_reads'表中有條目,那麼保持查詢不變,但是添加一個'WHERE'c'.'competition_id' = 2 '? – Hailwood

+0

@Hailwood - 你需要把條件放在WHERE子句中。請參閱[這個簡單的SQLFiddle示例演示](http://sqlfiddle.com/#!2/3649d/6) – hims056