sql >> データベース >  >> RDS >> Mysql

IN句で順番にレコードをフェッチします-IN句に重複する値があります

    論理的にはあなたが望むことをすることは不可能です、私はあなたの注文選択を使って説明しようとします

     ORDER BY FIELD(`question_level`, 1, 2, 1, 2, 3, 2, 4, 2, 3, 3)
    

    したがって、ここでは1が必要です 次に2 次に1 再びquestion_level 。これでテーブルにこれらの値があります。自分の主張を示すために必要なのは、question_level#1だけです。

    id   | question    | question_level
    ______________________________________
    1    | abc         | 1
    ______________________________________
    5    | qoindos     | 1
    ______________________________________
    

    ご覧のとおり、question_level=1の行があります では、システムはどのレベルの1をどのように決定するのでしょうか。 が最初で、どちらが2番目です。これを行う方法を決定する方法はありません。したがって、データベースが希望どおりにソートできなかったとしても。その選択を行うためのより多くの情報がなければ、それをソートするためにさえループを構築する方法はありません。最善の方法は、主キー、次にレベルで並べ替えることです。サーバー側で行う必要がある可能性が最も高いのはどれですか。

    ここでの間違いは、質問の実際の一意のIDを使用する必要があることだと思います。各レベルで質問の数に制限がある場合は、個別に対処する必要があります。

    うまくいけば、それは理にかなっています。

    xを選択しようとした場合 nでのランダムな質問の数 かなり簡単に解決できるレベル。たとえば、必要な場合

    • レベル1で2回の質問
    • レベル2で4回の質​​問
    • レベル3で3回の質問
    • レベル4で1回の質問。

    これは、idフィールドでランダムに並べ替え、そのレベルに適切なlimit句を使用しながら、レベルの4つの単純なクエリで解決できます。ちなみに、これらはあなたの質問のレベル数です。

    特定のレベルでランダムな質問を選択したい場合は、サブクエリを使用して選択することをお勧めします。 RAND() いくつかのパフォーマンスペナルティがあります。これは、主キーをランダム化し、テーブルに参加して、注文後に残りのデータを引き出すだけで回避できるはずです。ただし、ベンチマークする必要があります。

    その一例がこれです。

    SELECT
        q1.*
    FROM 
        tbl_questions AS q1
    JOIN
    (
        SELECT
            id
        FROM
            tbl_questions
        WHERE
            question_level = 1
        ORDER BY RAND() LIMIT 2
    ) AS q2 USING( id )
    

    私はこれを試したことがないことを認めなければなりませんが、私が持っていたアイデアだけです。



    1. サービスを中断せずに/ダウンタイムなしでDjangoアプリケーションをデプロイする

    2. 質問と回答のテーブルに参加しているレコードを数える

    3. 参加してクエリビルダーlaravelに特定のデータを表示する

    4. 異なるデータ型のCaseステートメント