2011-07-25 9 views
4

このトピックを調べて、JOIN LEFTやサブクエリのようないくつかのソリューションを紹介しましたが、私はmySQLで強くないので、結果を得ることができません。私は学校のプロジェクトのために私のウェブサイトにシンプルなPHPを使用しようとするウェブデザイナーの多くです。レコードが見つからない場合、MySQLのカウントは0を返しません

ブログに似たようなWebアプリケーションを作成しようとしています。投稿のコメント数を数えたいと思っていましたが、その行のコメントがない場合、クエリは0ではなく何も返しません。

これは以下のクエリです:

SELECT post.post_id, COUNT(comment) 
FROM `comment`, post 
WHERE `comment`.post_id = post.post_id 
GROUP BY post.post_id 

結果:

Record | post_id | COUNT(comment) 
1  | 12  | 2 
2  | 13  | 1 
3  | 15  | 1 
4  | 16  | 1 

あなたが見ることができるように、post_id 14はコメントがいません、ので、私のクエリは何も返しません。私の結果がこのように見えるようにするために何をしなければならないのですか?

Record | post_id | COUNT(comment) 
1  | 12  | 2 
2  | 13  | 1 
3  | 14  | 0 
4  | 15  | 1 
5  | 16  | 1 

また、私がPHPに関する詳細を知りたいとソリューションの背後にある概念を理解するために私の参照やリンクを与えるためにあなたたちのいいだろう:)

答えて

7

だから実際:

SELECT post.post_id, COUNT(comment) 
FROM `comment` 
INNER JOIN post ON `comment`.post_id = post.post_id 
GROUP BY post.post_id; 

あなたはコメント内に少なくとも1つの参照を持つ唯一のポスト行を収集します。

あなたは、この方法をに参加LEFTに結合タイプを変更する場合:

SELECT post.post_id, COUNT(comment) 
FROM `comment` 
LEFT JOIN post ON `comment`.post_id = post.post_id 
GROUP BY post.post_id; 

そして、ポストからの行がすべてそこにある、とコメントに関連していない場合はNULL値はコメントの列のために挿入されていますこの行は存在します(これは左結合です)。したがって、commentがテーブルコメントからのカラムであれば、postテーブルの各行に対してそこにありますが、NULL値では、post_idカラムのグループの後に、この投稿に関連するコメントのサブセットにはNULL値が1つだけ含まれます。 0

select count(NULL); 

0を返します。

を返す必要があります今、あなたはサブクエリを使用することができますが、それは本当に悪いアイデアだ、サブクエリは通常、代わりにLEFT JOINを、で行われ、通常はそれが時にはそれがありませんが、間違いですしかし、それは本当にしばしば間違いです。左結合を実行すると、2つのテーブル(ON句)のキ​​ー値を比較し、行の最終的な「一時的」結果を作成し、両方のテーブルの値を混合します(その後、クエリの他の部分のフィルタが適用されます)。副問合せを使用すると、最初の表の各行に対して2番目の表から結果を取得するために新しい問合せが実行されます(必ずしもそうではありませんが、もう1つの問題です)。

1

照会ポストテーブルとやりますコメントクエリのカウントのサブクエリ

SELECT post.post_id, (SELECT COUNT(comment) FROM `comment` WHERE `comment`.post_id = post.post_id) as comments FROM post 

これは、あなたがそのポイントを得るときにポケットベルで制限を追加たくさんまたは行と非常に遅くなることがあります。あなたは(あなたが登録しよための改質、何をすべきかである)ことを行うとき