私は2つのテーブルを持っています。1つはアイテムを格納し、もう1つはいいねを格納します。
Likesを格納するテーブルはvideo_likedと呼ばれ、video_idとuser_idの2つの列があり、video_id-user_id(UNIQUE)とuser_id-video_id(PRIMARY)の2つのインデックスがあります。
もう1つのテーブルはビデオと呼ばれ、プライマリインデックスと自動インクリメント列IDがあります。
視聴者が見ているものを気に入ったのと同じユーザーが気に入ったアイテムのリストを、気に入った人の数で並べ替えて、最低2件のいいねを付けて取得しようとしています。
私が使用しているクエリは
SELECT vid . * , count( video_liked1.user_id ) AS PersonCount
FROM video AS vid, video_liked, video_liked AS video_liked1
WHERE video_liked.user_id = video_liked1.user_id
AND video_liked.video_id <> video_liked1.video_id
AND video_liked1.video_id = 'ITEM_ID'
AND vid.id = video_liked.video_id
GROUP BY video_liked.video_id
HAVING count( video_liked1.user_id ) >2
ORDER BY PersonCount DESC
LIMIT 12
いいねがたくさんあるとクエリが遅いので、最も基本的な構造に減らしました
SELECT vid. *
FROM video AS vid, video_liked, video_liked AS video_liked1
WHERE video_liked.user_id = video_liked1.user_id
AND video_liked.video_id <> video_liked1.video_id
AND video_liked1.video_id = 'ITEM_ID'
AND vid.id = video_liked.video_id
GROUP BY video_liked.video_id
LIMIT 12
少し高速ですが、28k行のlikesテーブルで実行するには0.05秒かかります
EXPLAINは、幅が広すぎてワードラッピングなしではここに収まらない出力を提供するので、代わりにpastebinへのリンクがあります
http://pastebin.com/raw.php?i=6edwdniQ
これが私のテーブルもペーストビンにあります
http://pastebin.com/raw.php?i=jwK1QucA
編集:
提案どおりにクエリを変更しました
SELECT vid . *, count( v1.user_id ) AS PersonCount
FROM video AS vid
JOIN video_liked AS v1 ON vid.id = v1.video_id
JOIN video_liked AS v2 ON v2.video_id = 'ITEM_ID'
AND v1.user_id = v2.user_id
AND v1.video_id <> v2.video_id
GROUP BY v1.video_id
ORDER BY PersonCount DESC
LIMIT 12
速度低下の原因は、一時テーブルを作成するGROUPBYを使用しているようです。