Запрос MySQL - нужна небольшая помощь!

RM
На сайте с 21.06.2011
Offline
77
675

Короче делаю систему опросов на сайте, столкнулся с проблемой - запрос к БД, а вернее его параметры выборки. Нужно выбирать так: чтобы поле end_time(время завершения) было либо null, либо больше текущего времени(т.е. опрос еще не закончился), так же start_time должно быть меньше текущего времени и stopped=false.

Типы данных в полях:

start_time - datetime

end_time - datetime

stopped - tinyint

Запрос, который использую сейчас:

SELECT id, quest, answers FROM pref_polls

WHERE stopped=false
OR end_time=null
OR end_time>NOW()
AND start_time<NOW()
ORDER BY RAND() LIMIT 0, 1

Этот запрос работает ПОЧТИ правильно! Но проблема в том, что он выводит и те опросы, которые еще не начались и уже закончились(т.е. проблема с условиями выборки)... Уже перепробовал все... Аж руки опускаются... Прошу вашей помощи в решении вопроса!

Заранее благодарен!

siv1987
На сайте с 02.04.2009
Offline
427
#1

SELECT id, quest, answers FROM pref_polls

WHERE

end_time=null

OR end_time>NOW()

AND start_time<NOW()

AND stopped=false

ORDER BY RAND() LIMIT 0, 1

RM
На сайте с 21.06.2011
Offline
77
#2
siv1987:
SELECT id, quest, answers FROM pref_polls
WHERE
end_time=null
OR end_time>NOW()
AND start_time<NOW()
AND stopped=false
ORDER BY RAND() LIMIT 0, 1

хм... Работает, но как-то наполовину... Не выводит записи у которых end_time = NULL, просто игнорит(не видит в упор) их... У меня уже башка не варит, че этой mysql не нравится?? Вроде всегда работал норм, а тут как будто магия :)

ДП
На сайте с 23.11.2009
Offline
203
#3

В скобочки условия взять не помогает?


SELECT id, quest, answers FROM pref_polls
WHERE stopped=false
AND ( end_time=null
OR end_time>NOW() )
AND start_time<NOW()
ORDER BY RAND() LIMIT 0, 1
skAmZ
На сайте с 04.09.2009
Offline
122
#4
end_time is null OR end_........

..................

RM
На сайте с 21.06.2011
Offline
77
#5
Дикий пионер:
В скобочки условия взять не помогает?

SELECT id, quest, answers FROM pref_polls
WHERE stopped=false
AND ( end_time=null
OR end_time>NOW() )
AND start_time<NOW()
ORDER BY RAND() LIMIT 0, 1

Это кстати пробовал - он либо вообще ничего не выводил, либо всякую билиберду(я уж точно не помню - ооочень много вариантов испробовал). Но одно помню точно - этот вариант у меня почему-то не сработал...

KV
На сайте с 22.12.2011
Offline
88
#6

Может, посмотреть в сторону содержимого полей stopped? Тип данных?

Как бы на тебя ни давили, никогда не соглашайся на роль, что тебе не нравится *** http://handmade.tigress.com.ua
siv1987
На сайте с 02.04.2009
Offline
427
#7
RoMaN444Ik:
хм... Работает, но как-то наполовину... Не выводит записи у которых end_time = NULL,

http://mysql.ru/docs/man/Working_with_NULL.html

Great-Antique
На сайте с 21.08.2010
Offline
16
#8

end_time is null

Пишу небольшие PHP-скрипты бесплатно. Главное, чтобы интересно было. Блог о PHP-разработке (http://den.girnyk.com) и не только.
edogs software
На сайте с 15.12.2005
Offline
775
#9

Если честно - каша полная. Покажите дамп таблицы что-ли, включая создание таблиц - будет понятнее. По тому что сейчас можно сказать:

1) Если stopped tinyint, то оно не может быть false, и не надо так сравнивать. По контексту можно догадаться что это или 0 или 1.

2) Если end_time datetime, то проверку на null надо делать как is null, но возможно null это поле не может принимать (может забыли в таблице опцию это сделать), тогда надо сравнивать с 0000-00-00 00:00:00 тоже.

3) Приоритеты операций вообще невнятные, нужно расставлять скобки

4) Если тестируете на хостинге (да и на локалхосте бывает), есть ненулевая вероятность что NOW() в базе данных != текущему времени в php

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


SELECT id, quest, answers FROM pref_polls
WHERE stopped=0 and (end_time is null or end_time='0000-00-00 00:00:00' or end_time>NOW() ) and start_time<NOW();
ORDER BY RAND() LIMIT 0, 1

а совсем в идеале если вместо NOW(); для пущей уверенности (если запрос формируется на php) написать ".date("Y-m-d H:i:s")."

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий