ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

SQL:データがあれば件数をカウントし、データがなければ0件として結果を取得する方法

作品に対する投票をするシステムがあります。
投票の結果のデータをお客さんに送ったところ、0件だった場合も0件のデータが欲しいとの連絡がありました。

全作品に0件というデータがあり、そこに票を加算していれば簡単に算出できます。
投票のシステムは、票を入れたり外したりできるシステムになっています。
そのため、誰がどれに投票をしていることは管理できていますが、現時点である作品に対する投票が0件なのか、1件以上あるのかは、検索してみないとわかりません。

当初のSQL

以下のようなSQLでno毎の投票数を集計していました。
このSQLでは投票が0件の場合は取得できません。

SELECT no, count(no) FROM vote 
LEFT OUTER JOIN product 
ON vote.productid = product.id 
GROUP BY product.no
ORDER BY product.no

f:id:AJYA:20170516055738j:plain
photo credit: Michael Kappel SQL Saturday 119 Fifth Session 025 via photopin (license)

対処したSQL

2つのSQLの結果をUNIONで結合して、1つの結果となるようにしました。
片一方には、全データから結果に該当しないデータ、すなわち投票が0件のデータを取得しています。

SELECT no, count(no) FROM vote 
LEFT OUTER JOIN product 
ON vote.productid = product.id 
GROUP BY no 

UNION 

SELECT no, 0 FROM product 
WHERE no NOT IN
(
    SELECT no FROM vote 
    LEFT OUTER JOIN product 
    ON vote.productid = product.id 
    GROUP BY product.no 
    ORDER BY product.no
) 
GROUP BY no 

ORDER BY no;

SQLだけで欲しい結果を得ることができました。