クエリが不完全で、サポートが必要です。現在、非効率的な副選択で実行されており、結合を使用すると後で高速になると確信しています。また、クエリに追加する必要のある要素がありますが、その方法がよくわかりません。詳細:
私は3つのテーブルを持っています
- album
* albumId
* albumName
- objectTag
* objectTagObjectId (FK reference to albumId)
* objectTabTagId (FK reference to tagId)
- tag
* tagId
* tagName
私がやろうとしているのは、クエリに渡された別のアルバムにリンクされたタグに基づいて、ランダムなアルバム(たとえば、50)のリストを生成することです。
たとえば、「Britney Spears Greatest Hits」というアルバムがあり、そのアルバムには「pop」と「cheese」のタグが付けられています。次に、クエリにそのブリトニーアルバムのIDを渡し、クエリで「pop」と「cheese」のタグが付けられた50個のランダムな他のアルバムのリストを生成します。
これらのタグが付いたアルバムが20枚しかない場合、クエリはタグに関係なく、他の30枚のレコードにランダムなアルバムを入力する必要があります。
これまでのところ、タグに基づいてランダムなアルバムを取得できます。
SELECT albumId, albumName, objectTagTagId
FROM album
LEFT JOIN objectTag
ON objectTagObjectId = albumId
WHERE objectTagTagId IN
(
SELECT objectTagTagId
FROM album
LEFT JOIN objectTag
ON objectTagObjectId = albumId
WHERE albumId = 2471
)
ORDER BY RAND()
LIMIT 0,50
ただし、前述のように、これは非効率的で不完全です。
a)副選択の代わりに結合を使用してこれをより効率的にするにはどうすればよいですか?それは可能ですか?
b)タグに一致するレコードがx個(たとえば20)しかない場合に、タグに関係なく残りがランダムなレコードで埋められるように、このクエリをどのように変更する必要がありますか?