Autor Zpráva
MaK
Profil
Mám tuto tabulku:

a b
1 1
1 1
1 2
1 2
1 2
2 3
2 4
2 5    
2 5
2 5

a na výstupu potřebuju dostat:
1 2
2 5

Druhý sloupec výsledku obsahuje nejčastěji vyskytující se hodnotu ze sloupce B pro unikátní hodnotu sloupce A. Dokážu to pomocí:

select a, (select b from xxx as x2 where x2.a=x1.a group by b order by count(*) desc limit 1)
from xxx as x1
group by a

Je možné, se zbavit toho selektu v selektu? Napsat to jinak?

MaK
juriad
Profil
Ano, je to variace na dotaz ve FAQ: Některé časteji řešené dotazy pro MySQL - FAQ » Nalezení řádků s maximální (minimální) hodnotou
Oproti tvému dotazu to má výhodu tu, že databáze nemusí pokládat velké množství poddotazů (stejný počet, jako je hodnot a).
Pozor však na to, že dotaz může vrátit více řádek, než bys chtěl; rozdíl je v tom, že ty používáš LIMIT 1, který v případě několika stejně častých záznamů vrátí nějaký jeden z nich.

SELECT pocty.a, pocty.b
FROM   (SELECT a, b, Count(*) pocet
        FROM   tab
        GROUP  BY a, b) pocty
       JOIN (SELECT a, Max(pocet) maximum
             FROM   (SELECT a, b, Count(*) pocet
                     FROM   tab
                     GROUP  BY a, b) pocty
             GROUP  BY a) maxima
         ON pocty.a = maxima.a
            AND pocty.pocet = maxima.maximum 

Dotaz si můžeš vyzkoušet online:
http://sqlfiddle.com/#!2/03b1ab/2
MaK
Profil
juriad:
Děkuju, to je přesně ono.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: