Как получить запрос, который отображает только элементы, которые находятся в настоящем или будущем в MySQL? - PullRequest
3 голосов
/ 08 февраля 2012

У меня есть этот запрос:

$events = db_query("SELECT e.name, e.event_date, e.time, e.data, e.picture, e.event_type, v.latitude, v.longitude, v.address, v.name as vname 
FROM events e INNER JOIN venues v ON e.vid=v.vid 
WHERE FIND_IN_SET('".$q."', event_type)>0 
AND e.event_date > (SELECT DATE_SUB(curdate(), INTERVAL 1 DAY)) 
GROUP BY e.name");

И все работает нормально, кроме выбора даты.Я хотел бы, чтобы этот запрос перечислял только элементы, которые были накануне или в будущем, но на данный момент он перечисляет все элементы.Какие-нибудь указатели относительно того, где я иду не так?

РЕДАКТИРОВАТЬ: Если я удаляю первое предложение "WHERE", тогда запрос выполняется правильно и возвращает только элементы с датой в будущем.

Весь запрос выглядит следующим образом:

SELECT e.name, e.event_date, e.time, e.data, e.picture, e.event_type, v.latitude, v.longitude, v.address, v.name as vname 
FROM events e INNER JOIN venues v ON e.vid=v.vid 
WHERE FIND_IN_SET('liveSports', event_type)>0 
OR FIND_IN_SET('dancing', event_type)>0 
OR FIND_IN_SET('drinksDeals', event_type)>0 
OR FIND_IN_SET('pubQuiz', event_type)>0 
OR FIND_IN_SET('boardGames', event_type)>0 
OR FIND_IN_SET('fussball', event_type)>0 
OR FIND_IN_SET('speedDating', event_type)>0 
OR FIND_IN_SET('pool', event_type)>0 
OR FIND_IN_SET('liveMusic', event_type)>0 
OR FIND_IN_SET('foodDeals', e.event_type)>0
AND e.event_date >= (SELECT DATE_SUB(curdate(), INTERVAL 1 DAY))
GROUP BY e.name

У меня такое ощущение, что проблема может заключаться в количестве происходящего здесь ORing.Если я уменьшу размер запроса таким образом, результаты будут возвращаться, как и ожидалось.

Спасибо,

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Вы были очень близки, но держу пари, что вы хотите ИЛИ все FIND_IN_SET вместе, ТОТ проверить дату на всех из них.Я добавил паренсы.Кроме того, вам не нужен подзапрос (SELECT ...) вокруг DATE_SUB.

SELECT e.name, e.event_date, e.time, e.data, e.picture, e.event_type, v.latitude, v.longitude, v.address, v.name as vname 
FROM events e INNER JOIN venues v ON e.vid=v.vid 
WHERE (FIND_IN_SET('liveSports', event_type)>0 
OR FIND_IN_SET('dancing', event_type)>0 
OR FIND_IN_SET('drinksDeals', event_type)>0 
OR FIND_IN_SET('pubQuiz', event_type)>0 
OR FIND_IN_SET('boardGames', event_type)>0 
OR FIND_IN_SET('fussball', event_type)>0 
OR FIND_IN_SET('speedDating', event_type)>0 
OR FIND_IN_SET('pool', event_type)>0 
OR FIND_IN_SET('liveMusic', event_type)>0 
OR FIND_IN_SET('foodDeals', e.event_type)>0)
AND e.event_date >= DATE_SUB(curdate(), INTERVAL 1 DAY)
GROUP BY e.name
1 голос
/ 08 февраля 2012

Использование

e.event_date > UNIX_TIMESTAMP(subdate(current_date, 1)) 

или, например:

e.event_date > subdate(NOW(), INTERVAL 1 DAY) 

Кстати, было бы неплохо лишить ваш SELECT всех условий, кроме Date, максимально упростить его и затем заставить его работать. После этого верните обратно другие элементы SELECT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...