sql >> Database teknologi >  >> RDS >> Mysql

Tilstandsberegning uden et underforespørgselsfelt i MySQL?

Prøv denne løsning:

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

Forklaring:

Dette bruger stadig en form for underforespørgsel, men en, der kun udføres én gang i modsætning til en, der udføres på række-for-række-basis som i dit oprindelige eksempel.

Det fungerer ved først at vælge product_group id, producenten og antallet af, hvor mange gange producenten optræder for hver bestemt gruppe.

FROM sub-select vil se nogenlunde sådan ud efter udførelse (bare at lave data her):

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

Nu hvor vi har undervalgsresultatet, skal vi udvælge den række, der har maksimum i occurences felt for hver produktgruppe.

I den ydre forespørgsel grupperer vi subselect igen efter product_group felt, men denne gang kun product_group Mark. Når vi nu laver vores GROUP BY her kan vi bruge en virkelig overbevisende funktion i MySQL kaldet GROUP_CONCAT som vi kan bruge til at sammenkæde producenterne sammen og i hvilken som helst rækkefølge, vi ønsker.

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

Det, vi gør her, er at sammenkæde producenterne sammen, der er grupperet efter product_group id, ORDER BY a.occurrences DESC sørger for, at producenten med flest optrædener vises først i den sammenkædede liste. Endelig adskiller vi hver producent med ::: . Resultatet af dette for product_group 1 vil se sådan ud:

XYZ:::Test:::Singleton
 

XYZ vises først, da den har den højeste værdi i occurance Mark. Vi kun ønsker at vælge XYZ , så vi omslutter sammenkædningen i SUBSTRING_INDEX , hvilket vil tillade os kun at vælge det første element på listen baseret på ::: afgrænsning.

Slutresultatet bliver:

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


  1. Aktiver Database Mail i SQL Server (T-SQL)

  2. SQL Server vælg tilfældig (eller første) værdi med aggregering

  3. SQL Server-transaktionsloggen, del 3:Grundlæggende logføring

  4. PostgreSQL Check Constraint i Liquibase