SQL запрос, в чем разница?


Dram
511

Почему выборка дает разный результат при

WHERE t1.category_id = 116 or t1.category_id = 117

и

WHERE (t1.category_id = 116 or t1.category_id = 117)

второй вариант выдает меньше значений

?


ivan-lev

Dram:
второй вариант выдает меньше значений

А база точно одна и та же? =)


Sitealert

Заодно интересно было бы проверить запросы

WHERE t1.category_id>115 AND t1.category_id<118

и

WHERE (t1.category_id>115 AND t1.category_id<118)

Вдруг ещё 2 разных результата получатся?

PS: у меня получились 4 одинаковых результата, как ни странно… 🙁


DenisVS

Интересен весь запрос, то, что до WHERE и после 117


ivan-lev

Sitealert:
PS: у меня получились 4 одинаковых результата, как ни странно…

У Вас данные другие.. 😂

На http://sql-ex.ru, к примеру, есть задачи, в которых данные подобраны так, что некоторые «неправильные» запросы выдают правильные ответы на тестовой базе, но ошибочные на основной..


danforth

Количество строк должно быть одинаково, а вот порядок не детерминирован, если вы не указали ORDER BY (хотя и в этом случае он должен быть одинаков между двумя запросами). В запросе нет группировок?


Mik Foxi

Вопрос вообще про MySQL ?


ivan-lev

foxi:
Вопрос вообще про MySQL ?

Думаю, по большому счёту, не так уж важно. Со времён SQL-92 логика работы и приоритет операторов, используемых в этой части запроса не изменялась.

———- Добавлено 26.02.2020 в 11:11 ———-

Dram:
Почему выборка дает разный результат при

А можно контрольный пример в студию?.. ))) Хотя бы скрины результата, где разница видна (можно с затёртыми «важными» данными).. а лучше — запрос целиком и дамп таблиц (опять же, с затёртыми данными), для воспроизведения «разности результата»..


Dram

Запрос такой, база одна

SELECT t1.id,t1.fullname,t1.shortname,t1.lastname,t1.firstname,t1.middlename,

t2.name as city,t2.morpher,t2.morpher2,t4.name,t1.average,t1.comments,t1.vote,t1.rate,t5.created,t6.name as spec

FROM spec_items as t1

INNER JOIN spec_sections as t2 on t2.id = t1.section_id

LEFT JOIN spec_working as t3 on t3.item_id = t1.id

LEFT JOIN spec_items as t4 on t3.firm_id = t4.id

LEFT JOIN spec_categories as t6 on t6.id = t1.category_id

LEFT JOIN comments_items as t5 on (t5.object_id = t1.id and t5.id = (SELECT max(id) FROM comments_items WHERE `object_id` = t1.id and object_group = ‘com_spec’))

WHERE t1.category_id = 116 or t1.category_id = 117

AND t1.fullname not LIKE ‘%.%’

AND t1.comments <=2

AND t5.ip != ‘13.13.13.14’

GROUP BY t1.id

limit 10


danforth

Версия < 5.7? Покажите


SELECT @@GLOBAL.sql_mode;

Нужно добавить ONLY_FULL_GROUP_BY, чтобы ваш запрос не работал, после чего переписать его по человечески.

Ну и как обычно, сам WHERE скинули не полный, хорошо хоть база одна и та же.


wicker

так естественно разный результат. AND приоритетнее, чем OR. и в зависимости от скобок выходят разные условия. без скобок выходит t1.category_id = 116 без остальных условий ИЛИ t1.category_id = 117 со всеми следующими AND. А в случае со скобками выбираем записи обеих категорий, и на обе распространяются условия после AND

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *