如何获取只显示MySQL当前或未来项目的查询?

时间:2012-02-07 20:40:46

标签: mysql date

我有这个问题:

$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 个答案:

答案 0 :(得分:1)

使用

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

或者,例如:

e.event_date > subdate(NOW(), INTERVAL 1 DAY) 
顺便说一下,除了Date之外,删除所有条件的SELECT,最大限度地简化它然后让它工作就没问题了。之后返回其他SELECT元素。

答案 1 :(得分:1)

你非常接近,但我敢打赌你想把所有的FIND_IN_SET放在一起,然后检查所有这些的日期。我添加了parens。此外,您不需要DATE_SUB周围的子查询(SELECT ...)。

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