sql >> Database >  >> RDS >> Mysql

haal record op volgorde met IN-clausule - dubbele waarden in IN-clausule

Logischerwijs is het niet mogelijk om te doen wat je wilt, ik zal het proberen uit te leggen aan de hand van je bestelkeuze

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

Dus hier willen we 1 dan 2 dan 1 weer van het question_level . Nu in de tabel hebben we deze waarden. Ik zal me alleen bezighouden met vraag_niveau #1, dat is alles wat ik nodig heb om mijn punt te laten zien.

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

Zoals je kunt zien hebben we rijen voor question_level=1 Hoe zou het systeem nu beslissen welk niveau 1 is de eerste en welke is de tweede. Er is geen manier om te beslissen hoe dit te doen. Dus ongeacht of de database het niet sorteert zoals u dat wilt. Zonder meer informatie om die keuze te maken, is er geen manier om een ​​lus te construeren, zelfs niet om die te sorteren. U kunt het beste sorteren op de primaire sleutel en vervolgens op het niveau. Wat je waarschijnlijk aan de serverkant zou moeten doen.

Ik denk dat de fout die je hier hebt gemaakt, is dat je de werkelijke unieke ID van de vraag moet gebruiken, als je limieten hebt voor het aantal vragen op elk niveau, dan moet dat afzonderlijk worden behandeld.

Hopelijk is dat logisch.

Als u probeerde x . te selecteren aantal willekeurige vragen bij n niveau dat vrij gemakkelijk kon worden uitgewerkt. Als je bijvoorbeeld

  • 2x vragen op lv 1
  • 4x vragen bij lv 2
  • 3x vragen bij lv 3
  • 1x vragen op lv 4.

Dit zou kunnen worden uitgewerkt met vier eenvoudige zoekopdrachten voor het niveau, terwijl u willekeurig sorteert op het id-veld en een geschikte limietclausule voor dat niveau gebruikt. Dit zijn trouwens de aantallen niveaus in uw vraag.

ALS u willekeurige vragen op een bepaald niveau wilt selecteren, kunt u dit doen met een subquery. RAND() heeft een aantal prestatiestraffen die je zou moeten kunnen omzeilen door gewoon de primaire sleutel willekeurig te maken en vervolgens op de tafel te plaatsen om de rest van de gegevens eruit te halen zodra deze is besteld. Maar je zou het moeten benchmarken.

Dus een voorbeeld daarvan zou dit zijn.

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 )

Hoewel ik moet toegeven dat ik dit nog nooit heb geprobeerd, was het slechts een idee dat ik had.



  1. Plezier met (columnstore) compressie op een hele grote tafel – deel 2

  2. Schakel beveiligde priv uit voor het laden van gegevens op MySQL

  3. Externe MySQL-verbinding inschakelen:ERROR 1045 (28000):Toegang geweigerd voor gebruiker

  4. Geen gebruikersinteractiviteit Kan ik nog steeds SQL-injectie krijgen?