Хорошо, скажем, у меня есть две таблицы products
и product_options
.
структура таблицы products
выглядит так:
+--------------------------------------+
| p_id | product_name | product_status |
+--------------------------------------+
| 1 | Keyboard ABC | PENDING |
| 2 | Mouse ABC | ORDERED |
| 3 | Monitor ABC | ORDERED |
+--------------------------------------+
И таблица product_options
будет такой:
+--------------------------------------+
| po_id | p_id | opt_name | opt_value +
+--------------------------------------+
| 1 | 1 | part_no | KB-ABC-001 |
| 2 | 1 | stock | 0 |
| 3 | 2 | part_no | MS-ABC-001 |
| 4 | 2 | stock | 14 |
| 5 | 3 | part_no | MO-ABC-001 |
| 6 | 3 | stock | 10 |
+--------------------------------------+
Вопрос в том, что я хочу отобразить запрос обеих таблиц и указать конкретные критерии только для продукта, который я заказал. И результат будет примерно таким:
+------------------------------------------------------------+
| p_id | product_name | part_no | stock | product_status |
+------------------------------------------------------------+
| 2 | Mouse ABC | MS-ABC-001 | 14 | ORDERED |
| 3 | Monitor ABC | MO-ABC-001 | 10 | ORDERED |
+------------------------------------------------------------+
Мой SQL-запрос:
SELECT
t.p_id,
t.product_name,
(CASE WHEN t.key_name = 'part_no' THEN t.key_value ELSE NULL END) AS part_no,
(CASE WHEN t.key_name = 'stock' THEN t.key_value ELSE NULL END) AS stock,
t.product_status
FROM
(
SELECT
products.p_id as p_id,
products.product_name as product_name,
products.product_status as product_status,
product_options.opt_name as key_name,
product_options.opt_value as key_value
FROM
product_options Inner Join
products On product_options.p_id = products.p_id
WHERE
(products.product_status = 'ORDERED') AND
(product_options.opt_name = 'part_no' OR product_options.opt_name = 'stock')
) as t
GROUP BY t.p_id
Что у меня есть:
+------------------------------------------------------------+
| p_id | product_name | part_no | stock | product_status |
+------------------------------------------------------------+
| 2 | Mouse ABC | MS-ABC-001 | NULL | ORDERED |
| 3 | Monitor ABC | MO-ABC-001 | NULL | ORDERED |
+------------------------------------------------------------+
Но я хочу отображать NULL в поле stock
, поскольку данные на product_options
имеют:
+------------------------------------------------------------+
| p_id | product_name | part_no | stock | product_status |
+------------------------------------------------------------+
| 2 | Mouse ABC | MS-ABC-001 | 14 | ORDERED |
| 3 | Monitor ABC | MO-ABC-001 | 10 | ORDERED |
+------------------------------------------------------------+
Вопрос в том, как я могу отобразить / объединить две таблицы с таким регистром? Я пытался использовать GROUP_CONCAT
, но это не то, что я ищу.
См. SQLFiddle.
Пожалуйста помоги.