Mysql исключает всю строку, если одна из строк в присоединяющейся таблице не соответствует условию - PullRequest
0 голосов
/ 05 октября 2018

У меня есть три таблицы, которые представляют собой заказы, продукты и продукты-заказы, в которых в таблице продуктов есть поле состояния, обозначающее, что продукт активен или неактивен.Я должен показывать заказы, только если все продукты активны.Это означает, что если у меня есть заказ с двумя продуктами, и один из продуктов неактивен, я должен пропустить показ этой строки.

Рассмотрим следующий пример (Статус - 1 активен, 2 - неактивен в таблице товаров).

заказов

+-------------------+
|order_id | column_1|
| 1       | Value 1 |
| 2       | Value 2 |
| 3       | Value 3 |

заказов продуктов

+---------------------+
|id | p_id | order_id |
| 1 |  1   |     1    |
| 2 |  2   |     1    |
| 3 |  1   |     2    |
| 4 |  1   |     3    |

продуктов

+---------------------+
|id |  name  | status |
| 1 | Prod 1 |    1   |
| 3 | Prod 2 |    2   |

Желаемый вывод

+------------+
|  order_id  | 
|      2     | 
|      3     | 

Я пытался с присоединениемстолы, которые не помогли.Любая помощь очень ценится.

Спасибо

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Вы можете использовать join, group by и having.Я предполагаю, что статус 1 означает, что продукт активен.Итак:

select p.o_id as order_id
from orderproducts op join
     products p
     on op.p_id = p.id
group by op.o_id
having count(*) = sum(p.status = 1);

Обратите внимание, что таблица orders не нужна, поскольку идентификатор заказа находится в orderproducts.

Вы можете написать having как:

having max(p.status) = 1

Предполагается, что «активный» статус является наименьшим доступным значением.

0 голосов
/ 05 октября 2018

Вы можете найти идентификаторы заказов, у которых есть хотя бы один неактивный продукт, и исключить их из списка заказов

SELECT *
FROM orders
WHERE id NOT IN
    (SELECT DISTINCT(orderproducts.order_id)
     FROM orderproducts
     LEFT JOIN products ON orderproducts.p_id = products.id
     WHERE products.status <> 1)
0 голосов
/ 05 октября 2018
  • Предполагая, что status = 1 означает активный.
  • Внутреннее объединение таблиц от order до orderproducts до products с использованием соответствующих отношений.
  • Затем group by на order_id и отфильтровывание этих ордеров havingMax() значение статуса равно 1.

Попробуйте выполнить следующее:

SELECT o.order_id 
FROM orders AS o 
JOIN orderproducts AS op ON op.order_id = o.order_id 
JOIN products AS p ON p.product_id = op.product_id 
GROUP BY o.order_id 
HAVING MAX(p.status) = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...