- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
VK приобрела 70% в структуре компании-разработчика red_mad_robot
Которая участвовала в создании RuStore
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Короче делаю систему опросов на сайте, столкнулся с проблемой - запрос к БД, а вернее его параметры выборки. Нужно выбирать так: чтобы поле end_time(время завершения) было либо null, либо больше текущего времени(т.е. опрос еще не закончился), так же start_time должно быть меньше текущего времени и stopped=false.
Типы данных в полях:
start_time - datetime
end_time - datetime
stopped - tinyint
Запрос, который использую сейчас:
Этот запрос работает ПОЧТИ правильно! Но проблема в том, что он выводит и те опросы, которые еще не начались и уже закончились(т.е. проблема с условиями выборки)... Уже перепробовал все... Аж руки опускаются... Прошу вашей помощи в решении вопроса!
Заранее благодарен!
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
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 не нравится?? Вроде всегда работал норм, а тут как будто магия :)
В скобочки условия взять не помогает?
..................
В скобочки условия взять не помогает?
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
Это кстати пробовал - он либо вообще ничего не выводил, либо всякую билиберду(я уж точно не помню - ооочень много вариантов испробовал). Но одно помню точно - этот вариант у меня почему-то не сработал...
Может, посмотреть в сторону содержимого полей stopped? Тип данных?
хм... Работает, но как-то наполовину... Не выводит записи у которых end_time = NULL,
http://mysql.ru/docs/man/Working_with_NULL.html
end_time is null
Если честно - каша полная. Покажите дамп таблицы что-ли, включая создание таблиц - будет понятнее. По тому что сейчас можно сказать:
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")."