Предложение MySQL WHERE в запросе SELECT работает не так, как предполагалось

#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 Также благодарю вас за ваш вклад. Я пока сохраняю этот запрос, я думаю, и придумаю немного менее эффективный способ сделать это, потому что мой мозг просто не способен написать тот, который работает сегодня!