MySQL sorgusunda IF koşuluyla sayın


116

Biri haberler, diğeri yorumlar için olmak üzere iki tablom var ve durumu onaylanan yorumların sayısını almak istiyorum.

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 

Ancak bu sorgudaki sorun, bu habere karşılık gelen herhangi bir yorum olup olmadığına bakılmaksızın yorumlar sütunu için getirilen minimum değerin 1 olmasıdır.

Herhangi bir yardım çok kayda değer olacaktır.


5
COUNT yerine TOPLA kullanırsanız ne olur?
John Pick

Yanıtlar:


267

Kullanım sum()yerinecount()

Aşağıdakileri deneyin:

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
Veya MySQL'e özgü bir numara olarak SUM (ccc_news_comments.id = 'onaylandı')
mojuba

1
% 100 aynı @mojuba, sizin hile döner nullzaman COUNT(hiçbir koşul) iade ederdi 0. Ne zaman COUNTbir şey iade ediyorum ama 0, ancak SUM does dönüşü 0, sizin hile döner 0.
Robin Kanters

@mojuba durumu ve noktası . num_relevant_partsolduğunu SUM, koşullarıyla num_total_partsolan COUNT(parts.id)(çift yorum için üzgünüm, çok geç düzenlemek oldu)
Robin Kanters

68

Daha da iyisi (veya yine de daha kısa):

SUM(ccc_news_comments.id = 'approved')

Bu, MySQL'deki Boolean türü INT 0ve 1C'deki gibi temsil edildiği için çalışır (DB sistemlerinde taşınabilir olmayabilir.)

Gelince COALESCE()diğer yanıtlar belirtildiği gibi, birçok dil API'ler otomatik dönüştürmek NULLiçin ''değer getirirken. Örneğin PHP'nin mysqliarayüzü ile sorgunuzu onsuz çalıştırmanız güvenli olacaktır COALESCE().


3
Bu, önemli ölçüde daha okunabilir sql kodu sağlar. Güzel çözüm.
Dag Sondre Hansen

22

Bu çalışmalı:

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

count()yalnızca değerin var olup olmadığını kontrol edin. 0 var olan bir değere eşdeğerdir, bu yüzden bir tane daha sayar, NULL ise var olmayan bir değer gibidir, bu yüzden sayılmaz.


Bu durumda countolduğundan daha sezgisel olduğunu düşünüyorum sum.
Jeffery

4

Bu satırı değiştirin:

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

Bununla birlikte:

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

sayım (eğer (ccc_news_comments.id = 'onaylandı', ccc_news_comments.id, 0)) ??? ccc_news_comments.id kullanırsanız toplam kullanmanın anlamı ne olacaktır

Pardon ne demek istedin? Boole değeri 0 veya 1 olur, sonra
toplanır

@MostyMostacho, COALESCEtoplamı döndürüyor mu? MySQL belgesinde herhangi bir referans var mı?
Istiaque Ahmed

Evet, neden olmasın? Dokümanlarda birçok referans var: dev.mysql.com/doc/refman/5.7/en/…
Mosty Mostacho
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.