2012-06-08 11 views
6

私はデザインのリストが必要な左の結合に少し問題があります。各デザインには、それぞれのデザインのコメント数を表示したいと思います。私はLEFTを使用していますLEFT JOINとWHERE内の数

SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds 
LEFT JOIN tdic_comments com ON (com.design_id = ds.id) 
WHERE ds.approved = 1 AND ds.hidden = 0 AND com.approved = 1 
GROUP BY ds.id 
ORDER BY ds.date_added ASC 

登録しよう。しかし、それは唯一の1件のコメントを持っている一つのデザインを表示するよう、それは動作しませんが、私は第2の設計にはない、テーブル、中に2つのデザインを持っていますコメントがあります。

私はWHERE句を削除して

SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds 
LEFT JOIN tdic_comments com ON (com.design_id = ds.id) 
GROUP BY ds.id, com.approved, ds.approved 
ORDER BY ds.date_added ASC 

にSQLを変更した場合。しかし、それは承認されていないデザインとコメントの両方を選択するので、悪いことです。

私は間違っていますか、間違っていますか?

+0

'MySQL'に外のテーブルにフィルタを移動するだろう、私は推測しますか? – Quassnoi

答えて

8

移動ON句へのコメント上のすべてのフィルタ:

SELECT ds.*, COUNT(com.design_id) AS countcom 
FROM tdic_designs ds 
LEFT JOIN 
     tdic_comments com 
ON  com.design_id = ds.id 
     AND com.approved = 1 
WHERE ds.approved = 1 
     AND ds.hidden = 0 
GROUP BY 
     ds.id 
ORDER BY 
     ds.date_added ASC 
+0

治療のように機能します!どうもありがとう! –

3

あなたがWHERE句を使用する場合left join Sによって提供されている行に適用するには、これらの制限があります。したがって、制限に同意しない場合は、一部の行が削除されます。

これらの制限はON句に入れられており、動作しない場合は、行を削除する代わりにNULLと表示されます。このような

何か:あなただけgroup BYds.idを持っているとき

SELECT ds.id, count(com.comment) AS countcom 
FROM tdic_designs ds 
LEFT JOIN tdic_comments com ON (com.design_id = ds.id) AND ds.approved = 1 AND ds.hidden = 0 AND com.approved = 1 
GROUP BY ds.id 
ORDER BY ds.date_added ASC 

もう一つの問題は、SELECTds.*を使用しています。

+0

ありがとうございます:) –

+0

@MortenHagh問題があれば、答えを受け入れることを忘れないでください。 –

0

com.approved = 1をWHERE句に含めると、com.approvedNULLである行がすべて除外されるという問題があります。これは、外側の表に一致するものが見つからないすべての行を意味します。

他の人にも示唆されているように、この条件をON句に移動することでこれを修正できますが、結合条件ではないので、実際には好きではありません。

私はインライン・ビュー

SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds 
LEFT JOIN (SELECT * FROM tdic_comments com WHERE com.approved = 1) com 
ON (com.design_id = ds.id) 
WHERE ds.approved = 1 AND ds.hidden = 0 
GROUP BY ds.id 
ORDER BY ds.date_added ASC 
+0

これは、「MySQL」のパフォーマンスを著しく損なうでしょう。 – Quassnoi

+0

@DaveCosta非常に悪い解決策.. –

+0

@ aF.why? Quassnoiが述べたのと同じ理由を意味するなら、あなたは正しいかもしれませんが、質問はMySQLを指定していません。オラクルでは、これにパフォーマンス上の問題はありません。 –