2016-10-07 3 views
1

私はタグのテーブルとショーのテーブルを持っています。各ショーには約100個のタグがありますが、ショーごとに30個のタグしか抽出しません。MySQLのNOT IN句の中で 'LIMIT'を使用する代わりに?

30個のタグを選択する方法は、人気(ヒット数)に基づいて最初にトップ20を抽出することです。

次に、トップ20に表示されない10個のランダムなタグを選択し、それらをまとめてアルファベット順に並べたいとします。

"タグ" の表では、4列が含まれていますIDshow_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に制限されなければならないいくつかのタグを返し、私ができますなぜ:\

+0

あなた 'LIMIT 20,100'必要があります完璧な解決策になります。私はそれに欠陥がなく、MySQLがなぜトップ20のレコードの1つを返すのか分からない。 –

+0

私も。多くの場合、タグの大半はhit_countの値が0です(まだ開発中です)。 – user2597933

+0

制限句には結び付きが表示されません。したがって、hit_count> 0のレコードが15個あり、hit_countが0のレコードが1000個ある場合、上位20個には15個のレコードしか保証されません。残りの5個は任意に選択されます。しかし、私はあなたがすでにそれを知っていると思います。 –

答えて

-1

なぜサブクエリでLIMITを使用しているのですか?クエリの最後に使用することができます。このような何か -

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) 

    ORDER BY RAND() DESC 
) 

    UNION 

    (

    SELECT tag 
    FROM tags 
    WHERE show_id = x 
    ORDER BY hit_count DESC 
) 
) AS reorder 
ORDER BY reorder.tag ASC 
LIMIT 20 
+0

OPはサブテーブルから結果を制限しようとしていますが、クエリはメインテーブルの結果のみを制限します。これは目的の出力ではありません – baao

2

あなたが関係を持っている場合は代わりにサブクエリを使用して別の方法をIN (subquery)

SELECT t.tag 
    FROM tags t 
    LEFT JOIN (
     SELECT ID 
     FROM tags 
     WHERE show_id = x 
     ORDER BY hit_count DESC 
     LIMIT 20 
    ) b ON b.ID = t.ID 
    WHERE t.show_id = x AND b.ID IS NULL 
    ORDER BY RAND() DESC 
    LIMIT 10 

を使用しての派生テーブルに参加左ことができます。

select * from tags where hit_count < (
    select hit_count from tags order by hit_count desc limit 1 offset 19 
) order by rand() limit 10 
+0

私はこれを私のSQLに組み込みましたが動作しますが、何らかの理由で返されるタグの数が20-30の間で変動します – user2597933

+0

@ user2597933更新を参照してください – FuzzyTree

関連する問題