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
→ Ссылка