作品に対する投票をするシステムがあります。
投票の結果のデータをお客さんに送ったところ、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
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だけで欲しい結果を得ることができました。