'having子句'中的未知列“TableB.Date”

时间:2014-04-17 14:51:35

标签: mysql sql

当我按如下方式查询mysql数据库时,我在标题中收到错误。 不知道为什么,问题出在group by语句中,但我尝试了几种变化,似乎没有任何效果。

SELECT TableA.Name, DATE_FORMAT(TableB.Date, '%b %d %Y') AS "Date", COUNT(TableB.TableBID) 
  FROM TableA
  INNER JOIN TableB
  ON TableA.TableAID = TableB.TableAID
  WHERE TableA.Name = "john"
  GROUP BY DATE(TableB.Date)
  HAVING DATE_FORMAT(TableB.Date, '%b %d %Y') >= "Apr 12 2014"
  ORDER BY MAX(TableB.TableAID) ASC;

3 个答案:

答案 0 :(得分:1)

您应该使用group by条件在where之前进行比较。而且,您应该在日期而不是字符串上进行比较:

SELECT a.Name, DATE_FORMAT(b.Date, '%b %d %Y') AS "Date", COUNT(b.TableBID) 
FROM TableA a INNER JOIN
     TableB b
     ON a.TableAID = b.TableAID
WHERE a.Name = 'john' AND
      b.date >= '2014-04-12'
GROUP BY DATE(b.Date)
ORDER BY MAX(b.TableAID) ASC;

您希望在where中进行过滤的原因是它减少了馈送到聚合算法的数据的大小。您希望使用日期而不是字符串的原因是因为您不希望“March”在“April”之后。请注意,我还将日期常量上的分隔符更改为单引号。

答案 1 :(得分:1)

为什么不将TableB.Date >= '2014-04-12'放在WHERE子句中?

HAVING子句过滤查询的GROUP BY部分的输出 - 而WHERE子句过滤输入到GROUP BY - 而HAVING必须引用查询中指定的列之一。由于您选择了TableB.Date AS "Date",因此您需要在HAVING子句中引用Date。但是,由于您已经使用DATE_FORMAT将Date转换为字符串,因此无法将其与其他日期进行比较并获得您期望的结果。

此外,由于DATE是MySQL中的关键字,因此使用其他内容作为列名可以省去一些麻烦。您始终可以将其包装在反引号中,以确保MySQL知道它是对列名的引用。

答案 2 :(得分:0)

HAVING可以看到别名,所以

HAVING Date >= "Apr 12 2014"