找不到MySQL列

时间:2010-04-06 17:05:20

标签: mysql sql

没有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'

4 个答案:

答案 0 :(得分:7)

您无法使用<tablename>.<name>为列添加别名。而不是AS e.date1你真的必须使用AS date1。 (如果省略反引号以创建别名,则会出现SQL语法错误。)

但这只是一个原因。另一个是别名不能在WHERE子句中使用。

来自documentation

  

可以在查询选择列表中使用别名为列提供不同的名称。您可以使用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'