Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Cálculo de modo sem um campo de subconsulta no MySQL?


Tente esta solução:
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

Explicação:


Isso ainda usa uma forma de subconsulta, mas uma que é executada apenas uma vez, em oposição a uma que é executada linha por linha, como em seu exemplo original.

Ele funciona selecionando primeiro o product_group id, o fabricante e a contagem de quantas vezes o fabricante aparece para cada grupo específico.

O FROM sub-selecionar ficará assim após a execução (apenas criando dados aqui):
product_group   |   manufacturer   |    occurrences
---------------------------------------------------
1               |   XYZ            |    4
1               |   Test           |    2
1               |   Singleton      |    1
2               |   Eloran         |    2
2               |   XYZ            |    1

Agora que temos o resultado da sub-seleção, precisamos escolher a linha que tem o máximo nas occurences campo para cada grupo de produtos.

Na consulta externa, agrupamos a subseleção novamente pelo product_group campo, mas desta vez, somente o product_group campo. Agora, quando fazemos nosso GROUP BY aqui, podemos usar uma função realmente atraente no MySQL chamada GROUP_CONCAT que podemos usar para concatenar os fabricantes juntos e na ordem que quisermos.
...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...

O que estamos fazendo aqui é concatenar os fabricantes que estão agrupados por product_group id, o ORDER BY a.occurrences DESC garante que o fabricante com mais aparições apareça primeiro na lista concatenada. Finalmente estamos separando cada fabricante com ::: . O resultado disso para product_group 1 vai parecer:
XYZ:::Test:::Singleton

XYZ aparece primeiro pois tem o valor mais alto na occurance campo. Nós somente deseja selecionar XYZ , então encerramos a concatenação dentro de SUBSTRING_INDEX , o que nos permitirá escolher apenas o primeiro elemento da lista com base no ::: delimitador.

O resultado final será:
product_group    |    manufacturer_mode
---------------------------------------
1                |    XYZ
2                |    Eloran