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

MySQL Group By s nejvyšším N číslem každého druhu

SELECT  mo.Letter, md.Rank
FROM    (
        SELECT  DISTINCT letter
        FROM    mytable
        ) mo
JOIN    mytable md
ON      md.Letter >= mo.Letter
        AND md.Letter <= mo.Letter
        AND Rank <=
        COALESCE
                (
                (
                SELECT  Rank
                FROM    mytable mi
                WHERE   mi.letter = mo.letter
                ORDER BY
                        Rank
                LIMIT 1, 1
                ),
                0xFFFFFFFF
                )

Musíte mít složený index na (Letter, Rank) (v tomto pořadí)

Všimněte si této konstrukce:

md.Letter >= mo.Letter
AND md.Letter <= mo.Letter

místo pouhého md.Letter = mo.Letter

Vynucuje Range checked for each record což je efektivnější.

Viz tento článek na mém blogu:

pro více podrobností.



  1. MySQL:ORDER BY s prázdným datem '0000-00-00' jako poslední, ale zbytek ASC

  2. Použití SQL k určení statistiky počtu slov v textovém poli

  3. Ověřuje MySQLi standardně certifikáty serveru při použití SSL?

  4. Ladění soukromých procedur