Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Obliczanie trybu bez pola podzapytania w MySQL?

Wypróbuj to rozwiązanie:

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

Wyjaśnienie:

To nadal używa formy podzapytania, ale takiej, która jest wykonywana tylko raz, w przeciwieństwie do takiej, która jest wykonywana wiersz po wierszu, jak w oryginalnym przykładzie.

Działa, wybierając najpierw product_group id, producent i ile razy producent pojawia się dla każdej konkretnej grupy.

FROM sub-select będzie wyglądał mniej więcej tak po wykonaniu (po prostu uzupełnij dane tutaj):

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

Teraz, gdy mamy wynik podwyboru, musimy wybrać wiersz, który ma maksimum w occurences pole dla każdej grupy produktów.

W zewnętrznym zapytaniu ponownie grupujemy podselekcję według product_group pole, ale tym razem tylko product_group pole. Teraz, gdy wykonamy nasze GROUP BY tutaj możemy użyć naprawdę atrakcyjnej funkcji w MySQL o nazwie GROUP_CONCAT których możemy użyć do połączenia producentów razem i w dowolnej kolejności.

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

To, co robimy tutaj, to łączenie producentów razem, którzy są pogrupowani według product_group id, ORDER BY a.occurrences DESC upewnia się, że producent z największą liczbą występów pojawia się pierwszy na połączonej liście. Na koniec oddzielamy każdego producenta za pomocą ::: . Wynik tego dla product_group 1 będzie wyglądać tak:

XYZ:::Test:::Singleton

XYZ pojawia się jako pierwszy, ponieważ ma najwyższą wartość w occurance pole. My tylko chcesz wybrać XYZ , więc zamykamy konkatenację w SUBSTRING_INDEX , co pozwoli nam wybrać tylko pierwszy element listy na podstawie ::: ogranicznik.

Efektem końcowym będzie:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problemy z połączeniem danych z MySQL

  2. Pobranie najbardziej podobnych wierszy w tabeli MySQL i uporządkowanie ich według podobieństwa

  3. Losowy błąd:#1045 Nie można zalogować się do serwera MySQL

  4. Usuń informacje MySQL w tabeli za pomocą zadań Cron

  5. Połącz tabele w dwóch bazach danych za pomocą SQLAlchemy