没有where语句运行的SQL查询很好并输出了良好的结果,但是当我包含WHERE条件时,它在'where子句'中显示未知列'date1'。有什么问题?
SELECT
IF( e.weekly,
DATE_ADD(DATE(e.time),
INTERVAL CEIL(DATEDIFF('2010-04-08', e.time)/7) WEEK ),
DATE(e.time)) AS `e.date1`,
`v`.`lat`,
`v`.`lng`
FROM `events` AS `e`
INNER JOIN `venues` AS `v` ON e.venue_id = v.id
WHERE e.date1 > '2010-09-01'
答案 0 :(得分:7)
您无法使用<tablename>.<name>
为列添加别名。而不是AS e.date1
你真的必须使用AS date1
。
(如果省略反引号以创建别名,则会出现SQL语法错误。)
但这只是一个原因。另一个是别名不能在WHERE
子句中使用。
可以在查询选择列表中使用别名为列提供不同的名称。您可以使用GROUP BY,ORDER BY或HAVING子句中的别名来引用列
和
标准SQL不允许在WHERE子句中引用列别名。强制执行此限制是因为在评估WHERE子句时,可能尚未确定列值。
但您可以在HAVING
子句中使用别名:
SELECT
IF( e.weekly,
DATE_ADD(DATE(e.time),
INTERVAL CEIL(DATEDIFF('2010-04-08', e.time)/7) WEEK ),
DATE(e.time)) AS `date1`,
`v`.`lat`,
`v`.`lng`
FROM `events` AS `e`
INNER JOIN `venues` AS `v` ON e.venue_id = v.id
HAVING date1 > '2010-09-01'
或者在where子句中重复整个IF
语句。
答案 1 :(得分:0)
一个调试问题,如果你有一个简单的选择,你从'events'中选择e.date1作为'e'会发生什么?我通常会回到那种类型的查询,以防由于某种原因我的语法错误被某些东西隐藏。
顺便说一下,我注意到你有'e.date1'然后使用e.date1,即没有单引号。虽然我不是MySQL人,但这似乎行不通。
答案 2 :(得分:0)
编辑错误消息是»where子句'中的未知列'date1'«
原因是,op将if语句别名为alias-name'e.date1'。在他的where子句中,他写了e.date1而没有任何后退。 e.date1将在表e中查找列date1,并且与别名'e.date1'(后面的刻度)不同
您将子查询别名为名称"e.date1"
,然后引用表"date1"
中的列"e"
- 该列不存在。
您必须使用别名"date1"
,然后使用WHERE date1
或将地址写为WHERE ``e.date1``
(通过降价搞砸......
完整代码:
SELECT
IF( e.weekly,
DATE_ADD(DATE(e.time),
INTERVAL CEIL(DATEDIFF('2010-04-08', e.time)/7) WEEK ),
DATE(e.time)) AS `e.date1`,
`v`.`lat`,
`v`.`lng`
FROM `events` AS `e`
INNER JOIN `venues` AS `v` ON e.venue_id = v.id
WHERE `e.date1` > '2010-09-01'
或
SELECT
IF( e.weekly,
DATE_ADD(DATE(e.time),
INTERVAL CEIL(DATEDIFF('2010-04-08', e.time)/7) WEEK ),
DATE(e.time)) AS e.date1,
`v`.`lat`,
`v`.`lng`
FROM `events` AS `e`
INNER JOIN `venues` AS `v` ON e.venue_id = v.id
WHERE e.date1 > '2010-09-01'
答案 3 :(得分:0)
信不信由你,似乎需要在where子句中添加相同的IF语句。
SELECT
IF( e.weekly,
DATE_ADD(DATE(e.time),
INTERVAL CEIL(DATEDIFF('2010-04-08', e.time)/7) WEEK ),
DATE(e.time)) AS `e.date1`,
`v`.`lat`,
`v`.`lng`
FROM `events` AS `e`
INNER JOIN `venues` AS `v` ON e.venue_id = v.id
WHERE IF( e.weekly,
DATE_ADD(DATE(e.time),
INTERVAL CEIL(DATEDIFF('2010-04-08', e.time)/7) WEEK ),
DATE(e.time)) > '2010-09-01'