sql >> Database >  >> RDS >> Mysql

Modusberekening zonder een subqueryveld in MySQL?

Probeer deze oplossing:

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

Uitleg:

Dit gebruikt nog steeds een vorm van subquery, maar een die maar één keer wordt uitgevoerd, in tegenstelling tot een die rij voor rij wordt uitgevoerd, zoals in uw oorspronkelijke voorbeeld.

Het werkt door eerst de product_group . te selecteren id, de fabrikant en het aantal keren dat de fabrikant voor elke specifieke groep voorkomt.

De FROM sub-select ziet er na uitvoering ongeveer zo uit (verzin hier alleen gegevens):

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

Nu we het resultaat van de subselectie hebben, moeten we de rij kiezen die het maximum heeft in de occurences veld voor elke productgroep.

In de buitenste query groeperen we de subselect nogmaals op de product_group veld, maar deze keer alleen de product_group veld. Als we nu onze GROUP BY . doen hier kunnen we een echt boeiende functie in MySQL gebruiken genaamd GROUP_CONCAT die we kunnen gebruiken om de fabrikanten samen te voegen en in elke gewenste volgorde.

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

Wat we hier doen, is de fabrikanten samenvoegen die zijn gegroepeerd per product_group id, de ORDER BY a.occurrences DESC zorgt ervoor dat de fabrikant met de meeste verschijningen eerst . verschijnt in de aaneengeschakelde lijst. Ten slotte scheiden we elke fabrikant met ::: . Het resultaat hiervan voor product_group 1 ziet er als volgt uit:

XYZ:::Test:::Singleton

XYZ verschijnt als eerste omdat het de hoogste waarde heeft in de occurance veld. Wij alleen wil XYZ selecteren , dus we omsluiten de aaneenschakeling in SUBSTRING_INDEX , waardoor we alleen het eerste element van de lijst kunnen kiezen op basis van de ::: scheidingsteken.

Het eindresultaat is:

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



  1. Hoe PATCH gebruiken voor het bijwerken van een eenvoudig databaseveld?

  2. De maandindex van JavaScript Date Object begint met 0

  3. Percona 5.6 Docker Image kan mijn /etc/mysql/conf.d/*.cnf niet laden

  4. SQL-query om maxima over tientallen jaren te retourneren