sql >> Databáze >  >> RDS >> Mysql

Zobrazit sloupec velikosti jako řádek pro každý barevný produkt v související tabulce?

Neexistuje žádný příkaz PIVOT (MySQL kontingenční tabulky (transformace řádků na sloupce) ) v MySQL, takže váš dotaz bude statický pro velikost. Proto je lepší to v aplikaci odložit.

Myslel jsem, že pokud máte pouze konečnou a malou doménu pro sloupec velikosti, můžete použít následující dotaz, který jsem zveřejnil níže:

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)

Jak můžete vidět v podmínkách IF používám hodnotu velikosti, což znamená, že otázka je statická. Předpokládám, že všechny možné velikosti mohou být buď 32, 34, 36, 38.

Funkční ukázka @SQL Fiddle

Edit:Jak říkám od začátku Pokud jsou hodnoty velikosti neznámé nebo je doména velká, pak je lepší odložit práci s pivotem v rámci skriptu serveru (např. PHP), přesto můžete použít následující dotaz ke zpracování ve skriptu:

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`

Podívejte se, jak to funguje @SQL housle .




  1. co je lepší jeden velký dotaz nebo více malých dotazů?

  2. Chyba sqoop exportu místního csv do MySQL na mapreduce

  3. Použití řazení souborů k řazení podle sloupce data a času v MySQL

  4. Jak získat row_number v MySQL