繁体   English   中英

“具有子句”中的未知列“ TableB.Date”

[英]Unknown column “TableB.Date” in 'having clause'

当我如下查询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;

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

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”之后。 请注意,我还将日期常量的定界符更改为单引号。

为什么不将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知道它是对列名的引用。

HAVING可以看到别名,所以

HAVING Date >= "Apr 12 2014"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM