我有这个问题:
$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的数量有关。如果我以这种方式减小查询的大小,结果将按预期返回。
谢谢,
答案 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