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

recuperare il record in ordine con la clausola IN - con valori duplicati nella clausola IN

Logicamente non è possibile fare quello che vuoi, cercherò di spiegarti usando la tua scelta d'ordine

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

Quindi qui vogliamo 1 quindi 2 quindi 1 di nuovo del question_level . Ora nella tabella abbiamo questi valori. Mi occuperò solo di question_level #1, che è tutto ciò di cui ho bisogno per mostrare il mio punto.

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

Come puoi vedere abbiamo righe per question_level=1 Ora come farebbe il sistema a decidere quale livello 1 è il primo e quale è il secondo. Non c'è modo di decidere come farlo. Quindi, indipendentemente dal fatto che il database non riesca a ordinarlo nel modo desiderato. Senza ulteriori informazioni per fare quella scelta, non c'è modo di costruire un ciclo anche per ordinarlo. Il meglio che puoi fare è ordinare in base alla chiave primaria e quindi al livello. Cosa che dovresti fare molto probabilmente lato server.

Penso che l'errore che hai commesso qui sia che devi utilizzare l'ID univoco effettivo delle domande, se hai limiti sul numero di domande a ciascun livello, questo deve essere affrontato separatamente.

Speriamo che abbia senso.

Se stavi cercando di selezionare x numero di domande casuali in n livello che potrebbe essere risolto abbastanza facilmente. Ad esempio se volessi

  • 2x domande al livello 1
  • 4x domande al livello 2
  • 3x domande al livello 3
  • 1x domande al livello 4.

Questo potrebbe essere risolto con quattro semplici query per il livello, ordinando casualmente sul campo id e utilizzando una clausola limite appropriata per quel livello. A proposito, questi sono i numeri di livelli nella tua domanda.

SE vuoi selezionare domande casuali a un determinato livello, potresti volerlo fare con una sottoquery. RAND() ha alcune penalità di prestazioni che dovresti essere in grado di aggirare semplicemente randomizzando la chiave primaria e quindi unendoti sul tavolo per estrarre il resto dei dati una volta ordinato. Ma dovresti confrontarlo.

Quindi un esempio sarebbe questo.

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 )

Anche se devo ammettere che non l'ho mai provato, solo un'idea che avevo.