Toto je další příklad TOP X záznamů na Y příklad. Na každou otázku chcete 4 odpovědi. LIMIT je ve skutečnosti potřeba DVAKRÁT... Nejprve k omezení kvalifikačních otázek a další „žebříček“ odpovědí, který zaručuje, že v sadě výsledků otázek bude zahrnuta „Správná“ odpověď na VŽDY.
Můj přístup je tedy nejprve aplikovat náhodu na otázky, abych to dostal jako výsledek podmnožiny, pak to připojit k odpovědím a omezit X na Y. PAK to všechno můžeme zabalit. Zde je kritické, že vnitřní dotaz musí být seřazen podle ID otázky... A kvalifikátor „Správná“ odpověď je vždy na první pozici, ale cokoli po něm je náhodně rozděleno tak, aby zahrnovalo celkem 4 záznamy.
Poté poslední dotaz použije klauzuli WHERE k zahrnutí pouze tam, kde je pořadí pořadí <=4 (z možných všech 9 odpovědí zahrnutých pro 1 otázku, ale poté použije závěrečnou klauzuli „ORDER BY“, aby otázky zůstaly pohromadě, ale náhodně provede odpovědi, takže „Správně“ se již nevrací vždy na první pozici. Tuto vnější klauzuli „ORDER BY“ můžete odebrat pro účely testování pouze pro potvrzení funkčnosti a poté ji přidat zpět.
select
FinalQA.*
from
( select
QWithAllAnswers.*,
@RankSeq := if( @LastQuestion = QWithAllAnswers.id, @RankSeq +1, 1 ) ARankSeq,
@LastQuestion := QWithAllAnswers.id as ignoreIt
from
( SELECT
q.id,
q.question,
q.RandQuestionResult,
a.question_id,
a.answer,
a.correct
FROM
( SELECT q.ID,
q.Question,
q.question_ID,
RAND() as RandQuestionResult
FROM
questions q
WHERE
q.subject_id = 18
ORDER BY RAND()
LIMIT 5) JustQ
JOIN answers a
on q.id = a.question_id
ORDER BY
JustQ.RandQuestionResult,
if( a.correct = 1,0.000000, RAND()
) QWithAllAnswers,
( select @RankSeq := 0, @LastQuestion := 0 ) SQLVars
) FinalQA
where
FinalQA.ARankSeq < 5
order by
FinalQA.RandQuestionResult,
rand()
Pár malých změn... Ujistěte se v SQLVars
má :=
pro každý z úkolů. Když jsem původně psal, nechal jsem jeden „:“ vypnutý, což mohlo způsobit falešnou chybu. Také jsem kvalifikoval vnitřní "Order by" pomocí "a.correct =1" (neměl žádný odkaz na alias). Nakonec změňte vnější klauzuli WHERE na pouze < 5
místo <= 4
. Udělal jsem MNOHO z těchto největších seskupení X na Y a vím, že fungují, ale jsem si jistý, že mi chybí něco jednoduchého.
Také upravil IF()
náhodné, aby první hodnota byla desetinná, jinak se všechna náhodná čísla nastaví na 1 (celé číslo) a nikdy na zlomek... Také kvůli možným problémům s tím, kdy se použije ORDERING, jsem předem požádal o předtřídění všech Q a A chcete-li získat všechny správné odpovědi na první pozici, PAK použijte SQLVars
proti této sadě a poté dokončete pořadí pořadí a pořadí.