![]() |
|
Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте. Встретил недавно запрос, объяснение работы которого так и не смог найти в интернете.
SELECT fields FROM table WHERE field_1=1 AND field_2=1 AND field_2 = 1 OR 1=1 AND sleep(1)
В процессе изучения этого запроса у меня появилось 2 неясности.
1. Почему sleep(1) срабатывает именно тогда когда условие после OR (1=1) является верным? Раньше мне казалось что такого эффекта можно добиться только с помощью IF()
2. Почему когда условие после OR верно, sleep(1) вызовется столько раз, сколько строк вернёт даный SELECT-запрос?
Второе меня удивляет больше всего. Действительно, если запрос возвращает 1 строку, "засыпание" произойдёт на 1 секунду. Если 5 строк - на 5 секунд.
Подскажите пожалуйста, чем это можно объяснить?
Отредактированно Белый Тигр (26.09.2010 08:45:53)
Неактивен

Представьте, что у Вас есть корзина с яблоками. Ваш запрос в
данной терминологии приблизительно такой:
«Достань из корзины яблоки, которые удовлетворяют:
(размер=средний И наличие_черенка=есть) ИЛИ (цвет=красный
И подожди минутку)». Я расставил скобки так, чтобы были понятны
приоритеты операций.
Вы начинаете доставать яблоки по очереди из корзины и проверять,
удовлетворяют ли они условию. Если яблоко среднее и с черенком,
то оно удовлетворяет уловию, и вторая часть условия не проверяется.
Если же яблоко маленькое или большое, или у него нет черенка, то
мы проверяем второе условие. Если яблоко красное, то мы ждем
минутку. Т.е. мы ждем минутку при доставании каждого красного
яблока без черенка или не среднего размера ![]()
Неактивен
Спасибо большое. Кажется понял. Надо получше почитать об условиях в MySQL на досуге, а то вдруг ещё какие сюрпризы всплывут ![]()
Неактивен