当我按如下方式查询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;
答案 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"