MySql IN子句的异常结果



这是一个非常奇怪的家伙,至少对我来说是这样。

我有一个查询,它检索了过去几个月里排名前几位的实体及其相关记录计数的一些统计信息。

一切正常,但它不显示6月的结果。查询运行良好,只是不会给出6月的结果。

如果我做了以下任何一件事,那么事情又开始工作了:

  1. 将IN子句改为连接,并使用子查询返回与IN子句
  2. 使用的完全相同的列表
  3. 将周数添加到组中,这应该是不必要的,因为我已经检查过了,并且为记录正确地解析了MonthNumber。

但是我真的想找出为什么会发生这种情况,而不仅仅是修补查询。在我看来,这里的查询应该是有效的。

SELECT
YEAR(FROM_UNIXTIME(mt.`date_created`)) AS 'Year',
MONTH(FROM_UNIXTIME(mt.`date_created`)) AS 'MonthNumber',
MONTHNAME(FROM_UNIXTIME(mt.`date_created`)) AS 'MonthName',
WEEKOFYEAR(FROM_UNIXTIME(mt.`date_created`) ) AS 'Week',
`at`.`group_name`,
COUNT(`mt`.`mt_id_pk`) AS 'record_count' 
FROM
`my_table` AS `mt` 
INNER JOIN `another_table` AS `at` ON `mt`.`at_id_fk` = `at`.`at_id_pk` 
WHERE `at`.`group_name` IN ('something1','something2','something3')
GROUP BY `at`.`group_name`, `MonthNumber`
HAVING  `Year` = YEAR(NOW())
ORDER BY `MonthNumber` DESC

YEAR()不是一个聚合函数,不应该用于HAVING子句,它应该是这样的:

SELECT
YEAR(FROM_UNIXTIME(mt.`date_created`)) AS 'Year',
MONTH(FROM_UNIXTIME(mt.`date_created`)) AS 'MonthNumber',
MONTHNAME(FROM_UNIXTIME(mt.`date_created`)) AS 'MonthName',
WEEKOFYEAR(FROM_UNIXTIME(mt.`date_created`) ) AS 'Week',
`at`.`group_name`,
COUNT(`mt`.`mt_id_pk`) AS 'record_count' 
FROM
`my_table` AS `mt` 
INNER JOIN `another_table` AS `at` ON `mt`.`at_id_fk` = `at`.`at_id_pk` 
WHERE `at`.`group_name` IN ('something1','something2','something3')
AND YEAR(FROM_UNIXTIME(mt.`date_created`)) = YEAR(NOW())
GROUP BY `at`.`group_name`, `MonthNumber`
ORDER BY `MonthNumber` DESC

相关内容

  • 没有找到相关文章

最新更新