Справка по MySQL: как развернуть эту таблицу? - PullRequest
0 голосов
/ 15 августа 2010

С учетом таблицы, подобной этой:

==============================================
| ID1 | ID2 | ID3 | Name          | Value    |
==============================================
| 16  | 1   | 100 | item_name     | Toys     |
| 16  | 2   | 101 | item_name     | Computer |
| 16  | 1   | 102 | item_price    | 55       |
| 16  | 2   | 103 | item_price    | 200      |
| 16  | 1   | 104 | animal_name   | dog      |
| 16  | 2   | 105 | animal_name   | cat      |
| 16  | 1   | 106 | animal_gender | male     |
| 16  | 2   | 107 | animal_gender | female   |
| 18  | 1   | 100 | item_name     | Toys     |
| 18  | 2   | 101 | item_name     | Computer |
| 18  | 1   | 102 | item_price    | 55       |
| 18  | 2   | 103 | item_price    | 200      |
| 18  | 1   | 104 | animal_name   | dog      |
| 18  | 2   | 105 | animal_name   | cat      |
| 18  | 1   | 106 | animal_gender | male     |
| 18  | 2   | 107 | animal_gender | female   |
----------------------------------------------

Как мне использовать SQL, чтобы сделать это так:

==============================================================
| ID1 | item_name | item_price | animal_name | animal_gender |
==============================================================
| 16  | Toys      | 55         | dog         | male          |
| 16  | Toys      | 55         | cat         | female        |
| 16  | Computer  | 200        | dog         | male          |
| 16  | Computer  | 200        | cat         | female        |
| 18  | Toys      | 55         | dog         | male          |
| 18  | Toys      | 55         | cat         | female        |
| 18  | Computer  | 200        | dog         | male          |
| 18  | Computer  | 200        | cat         | female        |
--------------------------------------------------------------

Я буду создавать SQL-запрос на PHP.

Ответы [ 2 ]

1 голос
/ 16 августа 2010

отредактировано, после комментариев SONewbie

Должно соответствовать ANSI:

SELECT  
  ID1,  
  MAX(CASE WHEN Name = 'item_name' THEN Value ELSE NULL END) AS item_name, 
  MAX(CASE WHEN Name = 'item_price' THEN Value ELSE NULL END) AS item_price, 
  MAX(CASE WHEN Name = 'animal_name' THEN Value ELSE NULL END) AS animal_name, 
  MAX(CASE WHEN Name = 'animal_gender' THEN Value ELSE NULL END) AS animal_gender
FROM tbl 
GROUP BY ID1, ID2;

Это не даст желаемого результата - вместо этого результат будет выглядеть следующим образом:

==============================================================
| ID1 | item_name | item_price | animal_name | animal_gender |
==============================================================
| 16  | Toys      | 55         | dog         | male          |
| 18  | Toys      | 55         | dog         | male          |
| 16  | Computer  | 200        | cat         | female        |
| 18  | Computer  | 200        | cat         | female        |
--------------------------------------------------------------

Это потому, что ID1 и ID2 связывают кошку и самку с компьютером и только 200, а те же поля связывают собаку и самца с игрушками и только 55. Группировка по ID3 вводит много NULL, поскольку ID1 и ID3 вместе однозначно идентифицируют строки данных.

1 голос
/ 15 августа 2010

Попробуйте это для MySQL (не работает в ANSI SQL):

SELECT  
  ID1,  
  GROUP_CONCAT(if(Name = 'item_name', Value, NULL)) AS 'item_name', 
  GROUP_CONCAT(if(Name = 'item_price', Value, NULL)) AS 'item_price', 
  GROUP_CONCAT(if(Name = 'animal_name', Value, NULL)) AS 'animal_name', 
  GROUP_CONCAT(if(Name = 'animal_name', Value, NULL)) AS 'animal_name', 
FROM tbl 
GROUP BY ID1, ID2, ID3;

(Отказ от ответственности: не проверял ваши данные.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...