sql >> Databasteknik >  >> RDS >> Mysql

hämta post i ordning med IN-sats - med dubbla värden i IN-sats

Logiskt är det inte möjligt att göra vad du vill, jag ska försöka förklara med ditt beställningsval

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

Så här vill vi ha 1 sedan 2 sedan 1 igen av question_level . Nu i tabellen har vi dessa värden. Jag ska bry mig om bara question_level #1 vilket är allt jag behöver för att visa min poäng.

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

Som du kan se har vi rader för question_level=1 Hur skulle systemet nu bestämma vilken nivå 1 är första och som är andra. Det finns inget sätt att bestämma hur detta ska göras. Så oavsett om databasen misslyckas med att sortera den som du vill. Utan mer information för att göra det valet finns det inget sätt att konstruera en loop ens för att sortera det. Det bästa du kan göra är att sortera efter primärnyckeln och sedan nivån. Vilket du troligen skulle behöva göra på serversidan.

Jag tror att misstaget du gjorde här är att du måste använda frågornas faktiska unika ID, om du har gränser för hur många frågor på varje nivå måste det lösas separat.

Förhoppningsvis är det vettigt.

Om du försökte välja x antal slumpmässiga frågor vid n nivå som skulle kunna räknas ut ganska lätt. Till exempel om du ville ha

  • 2x frågor på lv 1
  • 4x frågor på lv 2
  • 3x frågor på lv 3
  • 1x frågor på lv 4.

Detta kan lösas med fyra enkla frågor för nivån, samtidigt som man sorterar slumpmässigt på id-fältet och använder en lämplig gränssats för den nivån. Dessa är förresten antalet nivåer i din fråga.

OM du vill välja slumpmässiga frågor på en given nivå, kanske du vill göra det med en underfråga. RAND() har några prestationspåföljder som du bör kunna gå runt genom att bara randomisera primärnyckeln och sedan gå med på bordet för att dra ut resten av data när den har beställts. Men du bör jämföra det.

Så ett exempel på det skulle vara detta.

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 )

Även om jag måste erkänna att jag aldrig har provat detta bara en idé jag hade.



  1. Hur man skriver en PL/SQL-procedur med x inmatningsparametrar och inmatning/output av x parametrar kombinerat

  2. Hur konverterar man SQL Query-resultat till PANDAS Data Structure?

  3. PDO och MySQL UPPDATERING i Foreach Loop

  4. SQL Server Tree Query