#mysql
#mysql
Вопрос:
Это определенно ошибка пользователя — нет ничего плохого в базовых данных или MySQL.
Что я пытаюсь сделать в предложении WHERE, так это ВЫБРАТЬ все material_batch_id и количество SUM’d из указанных пакетов (содержащихся в material_batch_track), где в настоящее время нет соответствующей записи в stocktakes_items или есть одна или несколько записей в stocktakes_items для данного material_batch_id, НО он был проверен и уже подсчитанкак 0 и, следовательно, не нуждается в повторной проверке.
Несмотря на то, что я ударился головой о 3 стола, запрос все еще не совсем выполняет то, что мне нужно, и я достаточно уверен, что проблема связана со структурой последней части моего предложения WHERE.
Я не включил все базовые структуры данных, поскольку я на 99% уверен, что это проблема структуры запроса, но если кто-то думает, что это не так, дайте мне знать, и я обновлю свой вопрос.
Есть ли в доме гений, который может увидеть, где я ошибаюсь, пожалуйста??
SELECT mb.material_batch_id AS mbid, SUM( mbt.qty ) AS expected_qty
FROM materials_batch AS mb
LEFT JOIN materials_batch_track mbt ON mbt.mbid = mb.material_batch_id
LEFT JOIN stocktakes_items sti ON sti.mbid = mb.material_batch_id
LEFT JOIN stocktakes st ON st.stid = sti.stid
WHERE mb.material_id =2
AND mb.batch_status
IN (
'Arrived', 'Completed'
)
AND mb.batch_type = 'whole'
AND sti_id IS NULL
OR (
qty_recorded !=0
AND qty_expected !=0
)
AND st.status NOT
IN (
'Cancelled', 'In Progress'
)
GROUP BY mbid
Запрос просто не возвращает результатов, что неверно. Я думаю, что есть проблема в области … « AND sti_id IS NULL OR ( )
Структура таблицы (на мой взгляд) проблемной области:
mysql> SELECT * FROM stocktakes_items;
-------- ------ ------ -------------- --------------
| sti_id | stid | mbid | qty_expected | qty_recorded |
-------- ------ ------ -------------- --------------
| 1 | 1 | 1 | 0 | 0 |
| 2 | 1 | 3 | 1 | 0 |
| 3 | 1 | 9 | 4 | 0 |
| 4 | 1 | 13 | 3 | 0 |
-------- ------ ------ -------------- --------------
4 rows in set (0.00 sec)
Заранее благодарю вас всех.
Комментарии:
1. Я подозреваю, что ваша проблема заключается в том, что вам нужно очень четко заключить ваши случаи в скобки, чтобы показать, какие AND и OR идут вместе — например, ГДЕ ((A И B И C) ИЛИ (D И E)) И F, а не ГДЕ A И B И C ИЛИ (D И E) И F
2. @mc110 Хм… Спасибо за ваш вклад. находит другой стол
3. @LeeS я согласен с mc110, ваш оператор WHERE не будет работать должным образом из-за использования OR MySQL будет разбираться так
WHERE mb.material_id = 2 AND mb.batch_status IN ( 'Arrived', 'Completed' ) AND mb.batch_type = 'whole' AND ( sti_id IS NULL OR (qty_recorded !=0 AND qty_expected !=0) ) AND st.status NOT IN ('Cancelled','In Progress')
, если вы не укажете скобки, он будет считать, что условие сразу слева и справа отOR
не все условия слева и справа отOR
4. @MartinBarker Также благодарю вас за ваш вклад. Я пока сохраняю этот запрос, я думаю, и придумаю немного менее эффективный способ сделать это, потому что мой мозг просто не способен написать тот, который работает сегодня!