MySQLクエリのIF条件でカウントする


115

2つのテーブルがあります。1つはニュース用で、もう1つはコメント用で、ステータスが承認済みに設定されているコメントの数を取得したいと思います。

SELECT
    ccc_news . *, 
    count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments
FROM
    ccc_news
    LEFT JOIN
        ccc_news_comments
    ON ccc_news_comments.news_id = ccc_news.news_id
WHERE
    `ccc_news`.`category` = 'news_layer2'
    AND `ccc_news`.`status` = 'Active'
GROUP BY
    ccc_news.news_id
ORDER BY
    ccc_news.set_order ASC
LIMIT 20 

ただし、このクエリの問題は、そのニュースに対応するコメントが存在するかどうかに関係なく、コメント列に対してフェッチされる最小値が1であることです。

どんな助けも高く評価されます。


5
COUNTの代わりにSUMを使用するとどうなりますか?
John Pick

回答:


265

sum()代わりに使用count()

以下をお試しください:

SELECT
    ccc_news . * , 
    SUM(if(ccc_news_comments.id = 'approved', 1, 0)) AS comments
FROM
    ccc_news
    LEFT JOIN
        ccc_news_comments
    ON
        ccc_news_comments.news_id = ccc_news.news_id
WHERE
    `ccc_news`.`category` = 'news_layer2'
    AND `ccc_news`.`status` = 'Active'
GROUP BY
    ccc_news.news_id
ORDER BY
    ccc_news.set_order ASC
LIMIT 20 

11
または、SUM(ccc_news_comments.id = 'approved')をMySQL固有のトリックとして使用することもできます
mojuba

1
ない100%同じ@mojuba、あなたのトリックを返すnullときCOUNT(NO条件)が戻ってきます0。ときは、COUNT何も戻ってきますが、 0を、しかしSUM 0、あなたのトリックリターンを返します0
Robin Kanters 2013年

@mojuba ケースとポイントnum_relevant_partsis SUMwith conditions、num_total_partsis COUNT(parts.id)(申し訳ありませんが、編集するには遅すぎました)
Robin Kanters

68

さらに良い(とにかく短い):

SUM(ccc_news_comments.id = 'approved')

MySQLのブール型はCと同様にINT 0and として表されるため、これは機能します1(ただし、DBシステム間で移植できない場合があります)。

COALESCE()他の回答で述べたように、多くの言語のAPIが自動的に変換するNULLには''値を取得するとき。たとえば、PHPのmysqliインターフェースでは、なしでクエリを実行しても安全COALESCE()です。


3
これにより、SQLコードが大幅に読みやすくなります。美しいソリューション。
Dag Sondre Hansen

22

これはうまくいくはずです:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL))

count()値が存在するかどうかのみを確認してください。0は既存の値と同等であるため、1つカウントされますが、NULLは存在しない値と同様であるため、カウントされません。


この場合countよりも直感的だと思いますsum
ジェフリー2017

4

この行を置き換えます:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments

これで:

coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments

count(if(ccc_news_comments.id = 'approved'、ccc_news_comments.id、0))??? ccc_news_comments.idを使用する場合にsumを使用する意味は何ですか

ごめんなさい、どういう意味ですか?ブール値は0または1になり、その後合計し、0と合体するnull値がある場合
Mosty Mostacho 2012年

@MostyMostacho、COALESCE合計を返しますか?MySQL docに参照がありますか?
イスティアケアーメド2017

はい、なぜでしょうか?ドキュメントでの多くの参照がありますdev.mysql.com/doc/refman/5.7/en/...は
Mosty Mostacho
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.