sql >> Base de Datos >  >> RDS >> Mysql

¿Modo de cálculo sin un campo de subconsulta en MySQL?

Prueba esta solución:

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

Explicación:

Esto todavía usa una forma de subconsulta, pero una que se ejecuta solo una vez en lugar de una que se ejecuta fila por fila, como en su ejemplo original.

Funciona seleccionando primero el product_group id, el fabricante y el recuento de cuántas veces aparece el fabricante para cada grupo en particular.

El FROM la subselección se verá así después de la ejecución (solo inventando datos aquí):

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

Ahora que tenemos el resultado de la subselección, debemos seleccionar la fila que tiene el máximo en las occurences campo para cada grupo de productos.

En la consulta externa, agrupamos la subselección una vez más por el product_group campo, pero esta vez, solo el product_group campo. Ahora cuando hacemos nuestro GROUP BY aquí, podemos usar una función realmente convincente en MySQL llamada GROUP_CONCAT que podemos usar para concatenar los fabricantes juntos y en el orden que queramos.

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

Lo que estamos haciendo aquí es concatenar a los fabricantes que están agrupados por product_group id, el ORDER BY a.occurrences DESC se asegura de que el fabricante con más apariciones aparezca primero en la lista concatenada. Finalmente estamos separando cada fabricante con ::: . El resultado de esto para product_group 1 se verá como:

XYZ:::Test:::Singleton

XYZ aparece primero ya que tiene el valor más alto en la occurance campo. Nosotros solo desea seleccionar XYZ , por lo que encerramos la concatenación dentro de SUBSTRING_INDEX , que nos permitirá seleccionar solo el primer elemento de la lista en función del ::: delimitador.

El resultado final será:

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