【问题标题】:Unusual Results from MySql IN clauseMySql IN 子句的异常结果
【发布时间】:2013-06-07 11:27:30
【问题描述】:

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

我有一个查询,它检索前几个实体的一些统计数据及其过去几个月的相关记录数。

一切正常,但没有显示 Junes 结果。查询运行良好,只是不会给出 Junes 结果。

如果我执行以下任何操作,那么一切都会重新开始:

  1. 将 IN 子句更改为连接,而不是使用子查询返回与 IN 子句使用的完全相同的列表
  2. 将星期数添加到组中,因为我已经检查过该组应该是不必要的,并且正确解析了记录的 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

【问题讨论】:

  • 您将 HAVING 用于聚合函数,但 YEAR() 不是聚合函数。例如 COUNT 或 SUM 是聚合函数。

标签: mysql in-clause


【解决方案1】:

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

【讨论】:

  • 好东西,谢谢。你是对的,它现在有效。我想知道为什么它在所有其他月份都有效,而不是六月。它只成功地使用 having 子句检索了今年的记录。这很不寻常,不是吗。
  • 已经运行了大约一年?想知道这个问题是不是今年 6 月是你 2 年来第一次有一个月?
  • 这可能是因为您以未规定的方式使用 HAVING 子句和/或也可能是您的 GROUP BY 具有 MonthNumber 和 mySQL 不包括今年的六月,因为它是还没有完成?只是一个猜测:-)
  • @Kickstart 和 Edper,就是这样。该应用程序仅在昨天才满 1 岁。 have 子句必须在超过一年之前根本没有使用过。再次感谢大家一百万。 ;-)
  • 有更多的想法。如果从去年 6 月开始有组记录,则 group by 将获取 group_name 和 MonthNumber 的计数。但是,其他字段未指定为按字段分组或聚合字段,因此将从未指定的行中获取。虽然不确定它通常会选择第一行的值,但它可能会带回年份或 2012 年(尽管 2012 年和 2013 年都有 6 月的数据)。 HAVING 子句然后处理该行,因为年份不是当前年份。
猜你喜欢
  • 2018-07-15
  • 2013-11-28
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多