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.