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

¿Mostrar columna de tamaño como fila para cada producto de color en la tabla relacionada?

No hay comando PIVOT (MySQL tablas dinámicas (transformar filas en columnas) ) en MySQL, por lo que su consulta será estática para el tamaño. Por eso es mejor posponer esto en la aplicación.

Pensé que si solo tiene un dominio finito y pequeño para la columna de tamaño, puede usar la siguiente consulta que publiqué a continuación:

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 puede ver en las condiciones IF, uso el valor de tamaño, que es lo que quiero decir que la pregunta es estática. Supongo que todos los tamaños posibles pueden ser 32, 34, 36, 38.

Demostración de trabajo @SQL Fiddle

Editar:como digo desde el principio, si los valores de tamaño son desconocidos o el dominio es grande, entonces es mejor posponer el trabajo de pivote dentro de la secuencia de comandos de su servidor (por ejemplo, PHP), aún puede usar la siguiente consulta para procesar en la secuencia de comandos:

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`

Vea cómo funciona @SQL fiddle .