私はタグのテーブルとショーのテーブルを持っています。各ショーには約100個のタグがありますが、ショーごとに30個のタグしか抽出しません。MySQLのNOT IN句の中で 'LIMIT'を使用する代わりに?
30個のタグを選択する方法は、人気(ヒット数)に基づいて最初にトップ20を抽出することです。
次に、トップ20に表示されない10個のランダムなタグを選択し、それらをまとめてアルファベット順に並べたいとします。
"タグ" の表では、4列が含まれていますID、show_id、タグとhit_count
私はSQLで素晴らしいではないんだけど、これは私が思い付いたものです。
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
:
SELECT * FROM (
(
SELECT tag
FROM tags
WHERE show_id = x
AND ID NOT IN
(SELECT ID
FROM tags
WHERE show_id = x
ORDER BY hit_count DESC
LIMIT 20)
ORDER BY RAND() DESC
LIMIT 10
)
UNION
(
SELECT tag
FROM tags
WHERE show_id = x
ORDER BY hit_count DESC
LIMIT 20
)
) AS reorder
ORDER BY reorder.tag ASC
しかし、MySQLは次のエラーを返します。
私のバージョンのMySQLが 'NOT IN'節で 'LIMIT'の使用をサポートしていない場合は、SQLを完全に再考する必要がありますが、解決策を見つけるのには苦労しています。誰も助けることができますか?ありがとう。
UPDATE:ランダム10個のタグを摘みに代わるものとして
、私も試してみました:
SELECT * FROM (
SELECT tag
FROM tags
WHERE show_id = x
ORDER BY hit_count DESC
LIMIT 20,100
) AS rnd_10 ORDER BY RAND() LIMIT 10
しかし、これはトップ20に制限されなければならないいくつかのタグを返し、私ができますなぜ:\
あなた 'LIMIT 20,100'必要があります完璧な解決策になります。私はそれに欠陥がなく、MySQLがなぜトップ20のレコードの1つを返すのか分からない。 –
私も。多くの場合、タグの大半はhit_countの値が0です(まだ開発中です)。 – user2597933
制限句には結び付きが表示されません。したがって、hit_count> 0のレコードが15個あり、hit_countが0のレコードが1000個ある場合、上位20個には15個のレコードしか保証されません。残りの5個は任意に選択されます。しかし、私はあなたがすでにそれを知っていると思います。 –