WHERE子句

时间:2016-10-03 07:26:51

标签: mysql

我想获得过去一年中每月注册用户的统计信息,因此我构建了此查询

SELECT MONTH(created_at) as m, COUNT(*) as c
FROM users
WHERE created_at >= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 12 MONTH), '%Y-%m')
GROUP BY m

现在我理解MySQL会做的是

  • 选择所有行
  • 执行条件检查 - 如果字段created_at是gte到DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 12 MONTH), '%Y-%m')将行添加到临时表,否则忽略它
  • 根据派生列m
  • 对行进行分组
  • 计算每个组中的行,并将它们放在派生列c

如果我认为上面所说的是正确的,我关注的是第2点。在一个典型的程序中,如果没有放入变量,if语句中的值将每次计算。

我是否需要将语句DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 12 MONTH), '%Y-%m')放在变量中并在我的WHERE子句中引用它以防止它在每一行重新计算,以及如何?

1 个答案:

答案 0 :(得分:1)

在执行查询时,将考虑的第一部分是where子句。在那之后group by然后它将选择所有那些结果行。

你不需要添加你最后谈到的任何额外变量