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

Výpočet režimu bez pole poddotazu v MySQL?

Zkuste toto řešení:

SELECT
    a.product_group,
    SUBSTRING_INDEX(GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'), ':::', 1) AS manufacturer_mode
FROM
    (
        SELECT
            aa.product_group,
            aa.manufacturer,
            COUNT(*) AS occurrences
        FROM
            products aa
        GROUP BY
            aa.product_group,
            aa.manufacturer
    ) a
GROUP BY
    a.product_group

Vysvětlení:

Toto stále používá formu poddotazu, ale takový, který se provede pouze jednou, na rozdíl od toho, který se spouští na základě řádku po řádku, jako ve vašem původním příkladu.

Funguje to tak, že nejprve vyberete product_group id, výrobce a počet, kolikrát se výrobce objeví pro každou konkrétní skupinu.

FROM sub-select bude po spuštění vypadat nějak takto (zde jen tvoří data):

product_group   |   manufacturer   |    occurrences
---------------------------------------------------
1               |   XYZ            |    4
1               |   Test           |    2
1               |   Singleton      |    1
2               |   Eloran         |    2
2               |   XYZ            |    1

Nyní, když máme výsledek dílčího výběru, musíme vybrat řádek, který má maximum v occurences pole pro každou skupinu produktů.

Ve vnějším dotazu seskupujeme podvýběr znovu podle product_group pole, ale tentokrát pouze product_group pole. Nyní, když uděláme naše GROUP BY zde můžeme použít opravdu působivou funkci v MySQL nazvanou GROUP_CONCAT které můžeme použít ke spojení výrobců dohromady a v libovolném pořadí.

...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...

To, co zde děláme, je zřetězení výrobců, kteří jsou seskupeni podle product_group id, ORDER BY a.occurrences DESC zajišťuje, aby se výrobce s nejvíce výskyty objevil jako první ve zřetězeném seznamu. Nakonec oddělíme každého výrobce pomocí ::: . Výsledek pro product_group 1 bude vypadat takto:

XYZ:::Test:::Singleton

XYZ se objeví jako první, protože má nejvyšší hodnotu v occurance pole. My pouze chcete vybrat XYZ , takže zřetězení zapouzdříme do SUBSTRING_INDEX , což nám umožní vybrat pouze první prvek seznamu na základě ::: oddělovač.

Konečný výsledek bude:

product_group    |    manufacturer_mode
---------------------------------------
1                |    XYZ
2                |    Eloran



  1. Ladění uložené procedury v SQL Server 2008

  2. Jak použít více příkazů WITH v jednom dotazu PostgreSQL?

  3. Jak hledat řádky obsahující podřetězec?

  4. MySQL MIN/MAX vrací správnou hodnotu, ale ne související informace o záznamu