Как сгенерировать этот SQL-запрос, например сводную таблицу

Я хочу, чтобы три таблицы объединены в один запрос, как сводная таблица. Имя моей главной таблицы – это продукты, а два имени поддержки – это code_keys и code_values

У меня есть имя главной таблицы: продукты

+------------------+ | Field | +------------------+ | productid | | catpath | | da | | l0 | | ig | | des | | notes | | wire | | lmm | +------------------+ 

примеры данных:

 +-----------+------+------+------+ | productid | da | ig | des | +-----------+------+------+------+ | 5 | 78 | 33 | 23 | | 8 | 88 | 13 | 21 | +-----------+------+------+------+ 

и 2 имени таблицы conf: code_keys . Сохраните структуру кода.

 +--------+ | Field | +--------+ | codeid | | title | | codekey| | format | +--------+ 

примеры данных:

 +--------+----------------+ | codeid | title | +--------+----------------+ | 2 | St Code | | 3 | Rear Les | +--------+----------------+ 

code_values

 +-------+ | Field | +-------+ | id | | pid | -> Product ID | codeid| | value | +-------+ 

и, наконец, данные примера:

 +----+------+--------+--------------+ | id | pid | codeid | value | +----+------+--------+--------------+ | 9 | 5 | 2 | ST 102 200 R | | 10 | 5 | 3 | 12 000 33 | | 11 | 6 | 2 | ST 343 432 R | | 12 | 6 | 3 | 34 343 24 | | 15 | 8 | 2 | ST 100 101 R | | 16 | 8 | 3 | 11 223 34 | | 17 | 0 | 2 | ST 343 432 R | | 18 | 0 | 3 | 34 343 24 | +----+------+--------+--------------+ 

Я хочу показать это в одном запросе:

Колонки продуктов | * code_keys rows> columns * |

 +-----------+------+------+------+--------------+----------+ | productid | da | ig | des | St Code | Rear Les | +-----------+------+------+------+--------------+----------+ | 5 | 78 | 33 | 23 | ST 102 200 R | 12 000 33| | 8 | 88 | 13 | 21 | ST 100 101 R | 11 223 34| +-----------+------+------+------+--------------+----------+ 

Есть идеи?

Solutions Collecting From Web of "Как сгенерировать этот SQL-запрос, например сводную таблицу"

Вы можете сделать это, используя оператор CASE :

 SELECT p.productid, p.da, p.ig, p.des ,GROUP_CONCAT(CASE WHEN ck.title = 'St Code' THEN cv.value ELSE NULL END) AS 'St Code' ,GROUP_CONCAT(CASE WHEN ck.title = 'Rear Les' THEN cv.value ELSE NULL END) AS 'Rear Les' FROM Products p JOIN code_values cv ON p.productid = cv.pid JOIN code_keys ck ON cv.codeid = ck.codeid GROUP BY p.productid; 

Если у вас есть неизвестный номер code_keys вы можете попробовать этот динамический запрос:

 SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'GROUP_CONCAT(CASE WHEN `title` = ''', `title`, ''' THEN cv.value ELSE NULL END) AS `', `title`, '`' ) ) INTO @sql FROM code_keys ck JOIN code_values cv ON cv.codeid = ck.codeid; SET @sql = CONCAT('SELECT p.productid, p.da, p.ig, p.des, ', @sql,' FROM Products p JOIN code_values cv ON p.productid = cv.pid JOIN code_keys ck ON cv.codeid = ck.codeid GROUP BY p.productid '); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; 

Вывод:

 | PRODUCTID | DA | IG | DES | ST CODE | REAR LES | -------------------------------------------------------- | 5 | 78 | 33 | 23 | ST 102 200 R | 12 000 33 | | 8 | 88 | 13 | 21 | ST 100 101 R | 11 223 34 | 

См. Этот SQLFiddle