在选择查询中选择查询?

Tim*_*ing 2 mysql sql

所以我想逐个月地将新用户与表中的返回用户进行比较.我有一个表,其中包含用户名和日期戳的每个操作.

例如,我可以轻松拉动执行操作的用户,例如,2011年1月.要查看每个用户是否是新用户,我需要针对之前的所有记录(2011年1月之前)运行用户名.

在我的摸索中,我想出了以下内容:

  SELECT ini.username,
         MIN(ini.datetime) AS firstAction,
         COUNT(ini.datetime) AS numMonth,
         (SELECT COUNT(*) 
            FROM tableActions tot
           WHERE tot.username = ini.username
             AND tot.datetime < '201101%' 
             AND tot.datetime > '201001%') AS numTotal
    FROM tableActions ini
   WHERE DATETIME >= '201101%' 
     AND DATETIME < '201102%'
GROUP BY ini.username
ORDER BY firstAction
Run Code Online (Sandbox Code Playgroud)

它没有错误,但它也没有完成.似乎非常激烈.

OMG*_*ies 5

您可以重新编写查询(假设tableactions.datetimeDATETIME数据类型):

   SELECT ini.username,
          MIN(ini.datetime) AS firstAction,
          COUNT(ini.datetime) AS numMonth,
          x.numTotal
     FROM tableActions ini
LEFT JOIN (SELECT tot.username,
                  COUNT(*) AS numTotal
             FROM tableActions tot
            WHERE tot.datetime > '2010-01-01'
              AND tot.datetime < '2011-01-01'
         GROUP BY tot.username) x ON x.username = ini.username
    WHERE ini.datetime BETWEEN '2011-01-01' AND '2011-01-31'
 GROUP BY ini.username
 ORDER BY firstAction
Run Code Online (Sandbox Code Playgroud)

可能有助于有一个指数username在最低限度,但使用覆盖指数username,datetime是值得考虑的.

datetime看起来比较可疑- LIKE是唯一支持通配符.