以下を単一のクエリに最適化することは可能ですか?
ここでは、一時テーブルを使用した複数のクエリよりも単一のクエリの方が効率的であると想定しているため、私の仮定が間違っている場合はお知らせください。
$id
現在のメンバー ID です。$list
最終結果から削除される itemid のリストです (例: 既にダウンロードされたアイテム)。
このクエリの目的は、メンバーと同様のアイテムをダウンロードした上位 500 人のメンバーを見つけること$id
です。次に、これらのメンバーがダウンロードしたすべてのアイテムを検索し、各メンバーからの同様のダウンロード数と各アイテムの合計ダウンロード数に基づくスコアでランク付けします。したがって、最終的な結果は、$id
メンバーへの推奨事項のリストになります。
クエリは次のとおりです。
mysql_query('CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY AS
(SELECT a.memberid, COUNT(*) `score` FROM table_downloads a INNER JOIN
(SELECT itemid FROM table_downloads WHERE memberid='.$id.') b ON a.itemid = b.itemid
WHERE a.memberid!='.$id.' GROUP BY a.memberid HAVING score>0 ORDER BY score DESC LIMIT 500)');
$res=mysql_query('SELECT table_downloads.itemid,COUNT(table_downloads.itemid*temp1.score) AS score2
FROM table_downloads,temp1
WHERE table_downloads.memberid=temp1.memberid AND table_downloads.itemid NOT IN ('.$list.')
GROUP BY table_downloads.itemid
ORDER BY score2 DESC LIMIT 30');
mysql_query('DROP TABLE temp1');
数百万行ある場合、このクエリは使用できなくなるほど時間がかかる可能性があります。迅速に実行されるようにするためのアドバイスも大歓迎です。
* mysql_query を意図的に使用しています。mysqli を使用するように言わないでください。*