MySQL-выбрать строки из двух таблиц с разными условиями выборки
День добрый. Прошу помощи. Ни как не могу одолеть выборку из 3 таблиц
Таблица 1 orders (хранит информацию о заказах)
Таблица 2 orders_info (хранит дополнительную информацию о заказах)
Таблица 3 orders_movement (хранит действия с заказами (оплаты, смена статуса заказа, доставка,...))
Нужно найти в таблице 2 (orders_info) строки где
name = 'Status'
а так же
value <> '6' AND value <> '8' AND value <> '11' AND value <> '14'
Помимо этого нужно еще из таблицы 3 orders_movement выбирать только те строки в которых
type = 'status'
а так же
value <> '5'
(означает что заказ оплачен) При этом в этой таблице может быть несколько записей для одного заказа, имеющие
type = 'status'
но с разными значениями
value
По отдельности я могу вывести или первое или второе условия, но вот вместе не получается
Так
WHERE value <> '6' AND value <> '8' AND value <> '11' AND value <> '14'
Выводятся все заказы за исключением тех, у которых value будет 6, 8, 11, 14
Так
WHERE o.id NOT IN(select order_id from order_movement om WHERE om.type = 'status' AND om.value =5)
я могу вывести все заказы, которые не были оплачены (не было смены status на 5).
запрос сам вызлядит так
SELECT o.id FROM orders AS o
LEFT JOIN orders_info AS sr ON sr.record = o.id AND sr.name = 'Status'
WHERE sr.value <> '6' AND sr.value <> '8' AND sr.value <> '11' AND o.id NOT IN(select order_id from #__can_order_movement om WHERE om.type = 'status' AND om.value =5);
Но он возвращает только неоплаченные заказы
Что нужно мне.
Таблица 1 orders
| id | name |
|---|---|
| 1 | name 1 |
| 2 | name 2 |
| 3 | name 3 |
| 4 | name 4 |
Таблица 2 orders_info
| record | name | value |
|---|---|---|
| 1 | Discont | 0 |
| 1 | Quantity | 10 |
| 1 | Status | 8 |
| 2 | Discont | 1 |
| 2 | Quantity | 5 |
| 2 | Status | 14 |
| 3 | Discont | 1 |
| 3 | Quantity | 25 |
| 3 | Status | 14 |
| 4 | Discont | 5 |
| 4 | Quantity | 7 |
| 4 | Status | 10 |
Таблица 3 orders_movement
| order_id | type | value |
|---|---|---|
| 1 | payment | 200 |
| 1 | status | 5 |
| 2 | status | 5 |
| 2 | status | 14 |
| 3 | status | 14 |
| 2 | status | 7 |
| 4 | payment | 300 |
| 4 | status | 5 |
Итоговая таблица (что должно быть выведено)
| id | name |
|---|---|
| 3 | name 3 |
| 4 | name 4 |
Первую запись не выводим, так как в таблице 2 orders_info она имеет value 8. В данном случае все равно имеется в таблице 3 orders_movement запись value 5 или нет. Это касается и value 6, 8, 11. Только для value 14 должно быть еще одно условия в виде записи value 5 в таблице 3 orders_movement.
Вторую запись не выводим, так как в таблице 2 orders_info она имеет value 14, а так же в таблице 3 orders_movement она имеет value 5.
Третью запись выводим, так как в таблице orders_movement она не имеет value 5, хоть в таблице 2 orders_info она имеет value 14.
Четвертую запись выводим, так как в таблице 2 orders_info она имеет value 10, хоть в таблице 3 orders_movement она имеет value 5.
Ответы (1 шт):
Для вывода только нужных строк, подцепляем из таблиц 2 и 3 строки, содержащие условия, которые нам нам не нужны, и проверяем, что такие не подцепились.
select o.id, o.name
from orders o
left join orders_info oi on (oi.record = o.id and oi.Discont='Status' and oi.value in (6,8,11,14))
left join orders_movement om on (om.order_id = o.id and om.type = 'status' and om.value = 5)
where oi.record is null or oi.value = 14 and om.order_id is null


