コードベースを継承したところ、既存のクエリが正しくありません。次のようになります (一般化されたテーブルと列はこちら):
select p.user_id, p.photo_id, p.date, count(p.photo_id) as 'Photos', count(v.photo_id) as 'Views'
from photos p
LEFT OUTER JOIN userviews v on v.user_id = p.user_id and v.photo_id = p.photo_id
where p.photo_id in ( 1,2,3 [...] )
GROUP BY photo_id, user_id
ORDER BY user_id, photo_id
結果セットはほぼ正しいので、しばらくの間、誰もそれが間違っていることに気付かなかったほどです。
表 2 (userviews) にデータがない場合、結果の行は正しいです。
ただし、そこにデータがある場合、結果セットはテーブル 1 のカウント値を複製しています。つまり、次のようになります。
1082 3381 2012-05-25 08:50:20 3 3 <--WRONG, should be 1
1082 3387 2012-07-26 15:02:36 2 2 <--WRONG, should be 4
1117 3381 2012-05-23 03:46:02 1 0 <--CORRECT
1117 3382 2012-05-23 03:45:54 1 0 <--CORRECT
1117 3383 2012-05-23 03:45:09 1 0 <--CORRECT
さて、これが SQL サーバーだったら、CTE を使用していまいましいことを書き直すだけですが、Mysql は WITH 句をサポートしておらず、複数の値を返すため、これらをサブクエリすることはできないと思います。
では、Mysql でこれを修正するにはどうすればよいでしょうか。前もって感謝します、私はこれに困惑しています。