Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Modusberechnung ohne Unterabfragefeld in MySQL?

Versuchen Sie diese Lösung:

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

Erklärung:

Dies verwendet immer noch eine Form von Unterabfrage, aber eine, die nur einmal ausgeführt wird, im Gegensatz zu einer, die Zeile für Zeile ausgeführt wird, wie in Ihrem ursprünglichen Beispiel.

Es funktioniert, indem Sie zuerst die product_group auswählen id, der Hersteller und die Anzahl, wie oft der Hersteller für jede bestimmte Gruppe vorkommt.

Der FROM Unterauswahl sieht nach der Ausführung etwa so aus (hier nur Daten erfinden):

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

Nachdem wir nun das Sub-Select-Ergebnis haben, müssen wir die Zeile mit dem Maximum in den occurences auswählen Feld für jede Produktgruppe.

In der äußeren Abfrage gruppieren wir den Subselect noch einmal nach product_group Feld, aber diesmal nur die product_group aufstellen. Wenn wir jetzt unser GROUP BY machen Hier können wir eine wirklich überzeugende Funktion in MySQL namens GROUP_CONCAT verwenden die wir verwenden können, um die Hersteller miteinander und in beliebiger Reihenfolge zu verketten.

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

Was wir hier tun, ist die Verkettung der Hersteller, die nach product_group gruppiert sind id, der ORDER BY a.occurrences DESC sorgt dafür, dass der Hersteller mit den meisten Auftritten zuerst erscheint in der verketteten Liste. Abschließend trennen wir jeden Hersteller mit ::: . Das Ergebnis davon für product_group 1 sieht so aus:

XYZ:::Test:::Singleton

XYZ erscheint zuerst, da es den höchsten Wert im occurance hat aufstellen. Wir nur XYZ auswählen möchten , also schließen wir die Verkettung in SUBSTRING_INDEX ein , wodurch wir nur das erste Element der Liste basierend auf ::: auswählen können Trennzeichen.

Das Endergebnis wird sein:

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