3

コードベースを継承したところ、既存のクエリが正しくありません。次のようになります (一般化されたテーブルと列はこちら):

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 でこれを修正するにはどうすればよいでしょうか。前もって感謝します、私はこれに困惑しています。

4

1 に答える 1

1

このクエリを試してください

SELECT p.user_id, p.photo_id, p.Photos, ph.date, v.Views
FROM photos ph,
      (SELECT p.user_id, p.photo_id, count(p.photo_id) as 'Photos'
      FROM photos p
      WHERE p.photo_id in ( 1,2,3 [...] )
      GROUP BY p.photo_id, p.user_id ) p,
     (SELECT v.user_id, v.photo_id, count(v.photo_id) as 'Views'
      FROM  userviews v
      WHERE v.photo_id in ( 1,2,3 [...] )
      GROUP BY v.photo_id, v.user_id 
      ) v
WHERE p.user_id = v.user_id AND 
      p.photo_id = v.photo_id AND
      ph.photo_id = p.photo_id AND
      ph.user_id = p.user_id
ORDER BY p.user_id, p.photo_id

編集 左結合の使用

SELECT p.user_id, p.photo_id, p.Photos, ph.date, v.Views
FROM (SELECT v.user_id, v.photo_id, count(v.photo_id) as 'Views'
      FROM  userviews v
      WHERE v.photo_id in ( 1,2,3 [...] )
      GROUP BY v.photo_id, v.user_id 
      ) v left join (SELECT p.user_id, p.photo_id, count(p.photo_id) as 'Photos'
      FROM photos p
      WHERE p.photo_id in ( 1,2,3 [...] )
      GROUP BY p.photo_id, p.user_id ) p     
ON p.user_id = v.user_id AND p.photo_id = v.photo_id
      left join photos ph 
On ph.photo_id = p.photo_id AND
      ph.user_id = p.user_id
ORDER BY p.user_id, p.photo_id

SELECT リスト内のすべての項目を GROUP BY または集約しない場合、MySQL は他の列の値を選択するため、予期しない結果が生じる可能性があります。( REFER ) それがあなたが間違った結果を得ていた理由でした

于 2013-03-19T06:08:59.027 に答える