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 .