Я хочу, чтобы три таблицы объединены в один запрос, как сводная таблица. Имя моей главной таблицы – это продукты, а два имени поддержки – это 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| +-----------+------+------+------+--------------+----------+
Есть идеи?
Вы можете сделать это, используя оператор 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 |