Mysql
 sql >> Baza danych >  >> RDS >> Mysql

pobierz rekord w kolejności z klauzulą ​​IN - mając zduplikowane wartości w klauzuli IN

Logicznie rzecz biorąc, nie można robić tego, co chcesz, postaram się wyjaśnić, korzystając z wyboru zamówienia

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

Więc tutaj chcemy 1 następnie 2 następnie 1 ponownie na poziomie question_level . Teraz w tabeli mamy te wartości. Zajmę się tylko pytaniem_poziomem nr 1, które jest wszystkim, czego potrzebuję, aby pokazać swój punkt widzenia.

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

Jak widać, mamy wiersze dla question_level=1 Jak system miałby zdecydować, który poziom 1? jest pierwszy, a który jest drugi. Nie ma sposobu, aby zdecydować, jak to zrobić. Więc niezależnie od tego, czy baza danych nie posortuje jej tak, jak chcesz. Bez większej ilości informacji potrzebnych do dokonania tego wyboru nie ma możliwości skonstruowania pętli nawet po to, by to posortować. Najlepsze, co możesz zrobić, to posortować według klucza podstawowego, a następnie poziomu. Które najprawdopodobniej musiałbyś zrobić po stronie serwera.

Myślę, że błąd, który tutaj popełniłeś, polega na tym, że musisz użyć rzeczywistego unikalnego identyfikatora pytań, jeśli masz limity liczby pytań na każdym poziomie, to należy je rozwiązać osobno.

Mam nadzieję, że to ma sens.

Jeśli próbowałeś wybrać x liczba losowych pytań w n poziom, który można było dość łatwo wypracować. Na przykład, jeśli chcesz

  • 2x pytania na poziomie 1
  • 4x pytania na poziomie 2
  • 3x pytania na poziomie 3
  • 1x pytania na poziomie 4.

Można to osiągnąć za pomocą czterech prostych zapytań o poziom, sortując losowo według pola id i stosując odpowiednią klauzulę limitu dla tego poziomu. Nawiasem mówiąc, są to liczby poziomów w twoim pytaniu.

JEŚLI chcesz wybrać losowe pytania na danym poziomie, możesz to zrobić za pomocą podzapytania. RAND() ma pewne kary za wydajność, które powinieneś być w stanie ominąć, po prostu losując klucz podstawowy, a następnie dołączając do tabeli, aby wyciągnąć resztę danych po ich uporządkowaniu. Ale powinieneś to porównać.

Przykładem może być to.

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 )

Chociaż muszę przyznać, że nigdy nie próbowałem tego tylko pomysłu, który miałem.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nieprawidłowa próba dostępu do pola przed wywołaniem read()

  2. jak poradzić sobie z aktualizacją zapytań MYSQL w ten sposób

  3. Brak zmapowanych encji Doctrine ORM zgodnie z obecną konfiguracją

  4. Połączenie MySQL z C# za pośrednictwem utworzonej bazy danych PHPMyAdmin

  5. Dołącz do dwóch stołów mysql