sql >> Databasteknik >  >> RDS >> Mysql

Lägesberäkning utan ett underfrågefält i MySQL?

Prova den här lösningen:

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

Förklaring:

Detta använder fortfarande en form av underfråga, men en som körs endast en gång i motsats till en som körs rad för rad, som i ditt ursprungliga exempel.

Det fungerar genom att först välja product_group id, tillverkaren och antalet gånger tillverkaren visas för varje särskild grupp.

FROM sub-select kommer att se ut ungefär så här efter körning (bara att skapa data här):

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

Nu när vi har undervalsresultatet måste vi välja ut raden som har maximalt antal occurences för varje produktgrupp.

I den yttre frågan grupperar vi undervalet igen efter product_group fältet, men den här gången endast product_group fält. Nu när vi gör vår GROUP BY här kan vi använda en riktigt övertygande funktion i MySQL som heter GROUP_CONCAT som vi kan använda för att sammanfoga tillverkarna och i vilken ordning vi vill.

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

Vad vi gör här är att sammanfoga tillverkarna som är grupperade per product_group id, ORDER BY a.occurrences DESC ser till att tillverkaren med flest framträdanden visas först i den sammanlänkade listan. Slutligen separerar vi varje tillverkare med ::: . Resultatet av detta för product_group 1 kommer att se ut så här:

XYZ:::Test:::Singleton

XYZ visas först eftersom det har det högsta värdet i occurance fält. Vi bara vill välja XYZ , så vi omsluter sammanlänkningen inom SUBSTRING_INDEX , vilket gör att vi bara kan välja det första elementet i listan baserat på ::: avgränsare.

Slutresultatet blir:

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



  1. Utdata till CSV i postgres med dubbla citattecken

  2. WHERE-klausul före INNER JOIN

  3. Hur OCT()-funktionen fungerar i MySQL

  4. java -postgresql senast infogade id vid infogning får inte