Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Datensatz in der Reihenfolge mit IN-Klausel abrufen - mit doppelten Werten in IN-Klausel

Logischerweise ist es nicht möglich, das zu tun, was Sie wollen, ich versuche es anhand Ihrer Bestellauswahl zu erklären

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

Hier wollen wir also 1 dann 2 dann 1 wieder vom question_level . Jetzt in der Tabelle haben wir diese Werte. Ich werde mich nur mit Question_level #1 befassen, was alles ist, was ich brauche, um meinen Standpunkt zu verdeutlichen.

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

Wie Sie sehen können, haben wir Zeilen für question_level=1 Wie würde nun das System entscheiden, welches Level 1 ist der erste ist und welcher der zweite ist. Es gibt keine Möglichkeit zu entscheiden, wie dies zu tun ist. Unabhängig davon, ob die Datenbank sie nicht so sortiert, wie Sie es möchten. Ohne weitere Informationen, um diese Wahl zu treffen, gibt es keine Möglichkeit, eine Schleife zu konstruieren, um das auch nur zu sortieren. Das Beste, was Sie tun könnten, ist, nach dem Primärschlüssel und dann nach dem Level zu sortieren. Was Sie höchstwahrscheinlich serverseitig tun müssten.

Ich denke, der Fehler, den Sie hier gemacht haben, ist, dass Sie die tatsächliche eindeutige ID der Fragen verwenden müssen. Wenn Sie die Anzahl der Fragen auf jeder Ebene begrenzt haben, muss dies separat behandelt werden.

Hoffentlich macht das Sinn.

Wenn Sie versucht haben, x auszuwählen Anzahl zufälliger Fragen bei n Ebene, die ziemlich einfach ausgearbeitet werden könnte. Zum Beispiel, wenn Sie

wollten
  • 2x Fragen auf Stufe 1
  • 4x Fragen auf Stufe 2
  • 3x Fragen auf Level 3
  • 1x Fragen auf Stufe 4.

Dies könnte mit vier einfachen Abfragen für die Ebene ausgearbeitet werden, während nach dem Zufallsprinzip nach dem ID-Feld sortiert wird und eine geeignete Begrenzungsklausel für diese Ebene verwendet wird. Übrigens sind dies die Anzahl der Ebenen in Ihrer Frage.

Wenn Sie zufällige Fragen auf einer bestimmten Ebene auswählen möchten, können Sie dies mit einer Unterabfrage tun. RAND() hat einige Leistungseinbußen, die Sie umgehen können sollten, indem Sie einfach den Primärschlüssel randomisieren und dann der Tabelle beitreten, um den Rest der Daten nach der Bestellung abzurufen. Aber Sie sollten es vergleichen.

Ein Beispiel dafür wäre dies.

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 )

Obwohl ich zugeben muss, dass ich das noch nie ausprobiert habe, war es nur eine Idee, die ich hatte.