sql >> Database teknologi >  >> RDS >> Mysql

hent post i rækkefølge med IN-klausul - med duplikerede værdier i IN-klausul

Logisk set er det ikke muligt at gøre, hvad du vil, jeg vil prøve at forklare ved hjælp af dit ordrevalg

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

Så her vil vi have 1 derefter 2 derefter 1 igen af ​​question_level . Nu i tabellen har vi disse værdier. Jeg vil bekymre mig om spørgsmålsniveau #1, hvilket er alt, hvad jeg behøver for at vise min pointe.

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

Som du kan se, har vi rækker for question_level=1 Hvordan ville systemet nu beslutte hvilket niveau 1 er første og som er anden. Der er ingen måde at beslutte, hvordan man gør dette. Så uanset at databasen ikke sorterer den som du ønsker. Uden mere information til at træffe dette valg er der ingen måde at konstruere en løkke, selv for at sortere det. Det bedste du kan gøre er at sortere efter den primære nøgle og derefter niveauet. Hvilket du højst sandsynligt skal gøre på serversiden.

Jeg tror, ​​at den fejl, du lavede her, er, at du skal bruge spørgsmålets faktiske unikke ID, hvis du har grænser for, hvor mange spørgsmål på hvert niveau, så skal det behandles separat.

Forhåbentlig giver det mening.

Hvis du prøvede at vælge x antal tilfældige spørgsmål ved n niveau, der kunne klares ret nemt. For eksempel hvis du ønskede

  • 2x spørgsmål på lv 1
  • 4x spørgsmål på lv 2
  • 3x spørgsmål på lv 3
  • 1x spørgsmål på lv 4.

Dette kunne løses med fire simple forespørgsler til niveauet, mens man sorterer tilfældigt på id-feltet og bruger en passende grænsesætning for det pågældende niveau. Disse er i øvrigt antallet af niveauer i dit spørgsmål.

HVIS du ønsker at vælge tilfældige spørgsmål på et givet niveau, kan du gøre det med en underforespørgsel. RAND() har nogle præstationsstraffe, som du burde være i stand til at omgå ved blot at randomisere den primære nøgle og derefter slutte sig til bordet for at trække resten af ​​dataene ud, når de er bestilt. Men du bør benchmarke det.

Så et eksempel på det ville være dette.

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 )
 

Selvom jeg må indrømme, at jeg aldrig har prøvet dette, bare en idé, jeg havde.



  1. hvordan duplikere mine sql resultater?

  2. PHP-databaseoutput viser ikke den rigtige vej

  3. Oracle MERGE raise ORA-00904 fejl

  4. Sammenføj to rækker, der har samme værdi i to kolonner