sql >> Databáze >  >> RDS >> Mysql

načíst záznam v pořadí s klauzulí IN - s duplicitními hodnotami v klauzuli IN

Logicky není možné dělat, co chcete, pokusím se to vysvětlit pomocí vašeho výběru objednávky

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

Takže tady chceme 1 pak 2 pak 1 znovu na question_level . Nyní v tabulce Máme tyto hodnoty. Budu se zabývat pouze otázkou_úrovně č. 1, což je vše, co potřebuji, abych ukázal svůj názor.

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

Jak vidíte, máme řádky pro question_level=1 Nyní, jak by systém rozhodl, která úroveň 1 je první a který je druhý. Neexistuje způsob, jak se rozhodnout, jak to udělat. Takže bez ohledu na to, že se databáze nepodaří seřadit tak, jak chcete. Bez dalších informací k provedení této volby neexistuje způsob, jak vytvořit smyčku, ani to třídit. Nejlepší, co můžete udělat, je seřadit podle primárního klíče a poté podle úrovně. Což byste s největší pravděpodobností museli udělat na straně serveru.

Myslím, že chyba, kterou jste zde udělali, je, že musíte použít skutečné jedinečné ID otázek, pokud máte limity na počet otázek na každé úrovni, pak je třeba to řešit samostatně.

Snad to dává smysl.

Pokud jste se pokoušeli vybrat x počet náhodných otázek na n úroveň, která by se dala vypracovat poměrně snadno. Například pokud jste chtěli

  • 2x otázky na lv 1
  • 4x otázky na lv 2
  • 3x otázky na lv 3
  • 1x otázky na lv 4.

To by se dalo vyřešit čtyřmi jednoduchými dotazy pro úroveň, při náhodném řazení v poli id ​​a použití vhodné klauzule o limitu pro tuto úroveň. Mimochodem toto jsou počty úrovní ve vaší otázce.

POKUD chcete vybrat náhodné otázky na dané úrovni, můžete to udělat pomocí poddotazu. RAND() má určité výkonnostní sankce, které byste měli být schopni obejít pouhým náhodným výběrem primárního klíče a poté připojením na stůl, abyste vytáhli zbytek dat, jakmile budou objednána. Ale měli byste to porovnat.

Příkladem může být toto.

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 )

I když musím přiznat, že jsem to nikdy nezkoušel, jen jsem měl nápad.



  1. Spočítat počet jedinečných hodnot

  2. Cizí klíče odkazující na jiné cizí klíče v PostgreSQL

  3. Dotaz Rails 4 jedinečný jediným atributem

  4. vyberte jednu hodnotu, pokud existuje, jinou, pokud ne