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

Exibir coluna de tamanho como linha para cada produto de cor na tabela relacionada?


Não há comando PIVOT (MySQL tabelas dinâmicas (transformar linhas em colunas) ) no MySQL para que sua consulta seja estática por tamanho. É por isso que é melhor adiar isso na aplicação.

Pensei que se você tivesse apenas um domínio finito e pequeno para a coluna de tamanho, então você pode usar a seguinte consulta que postei abaixo:
mysql> SELECT 
    ->      c.color as color,
    ->      SUM(IF(s.size = 32, o.amount, 0)) as '32',
    ->      SUM(IF(s.size = 34, o.amount, 0)) as '34',
    ->      SUM(IF(s.size = 36, o.amount, 0)) as '36',
    ->      SUM(IF(s.size = 38, o.amount, 0)) as '38'
    ->  FROM `colors` c
    ->  INNER JOIN `order` o
    ->  INNER JOIN `sizes` s
    ->      WHERE c.`id` = o.`color` and s.`id` = o.`size`
    -> GROUP BY color 
    -> ;
+-------+------+------+------+------+
| color | 32   | 34   | 36   | 38   |
+-------+------+------+------+------+
| blue  |    3 |    4 |    2 |    0 |
| red   |    1 |    0 |    0 |    0 |
+-------+------+------+------+------+
2 rows in set (0.04 sec)

Como você pode ver nas condições IF, eu uso o valor do tamanho que é o que quero dizer que a pergunta é estática. Estou assumindo que todos os tamanhos possíveis podem ser 32, 34, 36, 38.

Demonstração de trabalho @SQL Fiddle

Editar:Como estou dizendo desde o início, se os valores de tamanho são desconhecidos ou o domínio é grande, é melhor você adiar o trabalho de pivô no script do servidor (por exemplo, PHP), ainda assim você pode usar a seguinte consulta para processar no script:
SELECT 
     c.color as color,
     s.size,
     o.amount  --Edit: added 
 FROM `colors` c
 INNER JOIN `order` o
 INNER JOIN `sizes` s
     WHERE c.`id` = o.`color` and s.`id` = o.`size`

Veja como funciona @fiddle SQL .