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

mysql komplikované sql

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:= 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í.



  1. HTML formulář fungující jako get namísto post

  2. SQLite INSERT – PŘI AKTUALIZACI DUPLIKÁTNÍHO KLÍČE (UPSERT)

  3. Nelegální kombinace porovnávání pro operaci „jako“ při vyhledávání pomocí Ignited-Datatables

  4. Jak mohu vybrat * z tabulky v MySQL, ale vynechat některé sloupce?