MYSQL仅选择创建多条记录的用户,而不进行分组

时间:2016-09-07 13:03:20

标签: mysql

我有 UserLogs 表和查询日志监控

SELECT from_unixtime(logDate/1000) as logDate, userId, userAction FROM UserLogs
WHERE logDate > subdate(now(), INTERVAL 1 day ) 

我想改进它,只显示结果只有超过1条记录的用户,而不进行分组。

实施例

用户A 一天制作1条记录,用户B 制作5条记录,用户C 在同一天制作3条记录。 SQL结果将显示8列 - 来自用户B 的5条记录和来自用户C 的3条记录。

<table border='1'>
<tr>
  <td>UserId</td>
  <td>Time</td>
  <td>Action</td>
</tr>
<tr>
  <td>B</td>
  <td>11.56</td>
  <td>POST</td>
</tr>
<tr>
  <td>B</td>
  <td>11.57</td>
  <td>DELETE</td>
</tr>
<tr>
  <td>B</td>
  <td>11.58</td>
  <td>COMMENT</td>
</tr>
<tr>
  <td>B</td>
  <td>11.59</td>
  <td>DELETE</td>
</tr>
<tr>
  <td>B</td>
  <td>11.60</td>
  <td>EDIT</td>
</tr>
<tr>
  <td>C</td>
  <td>11.60</td>
  <td>EDIT</td>
</tr>
<tr>
  <td>C</td>
  <td>11.60</td>
  <td>COMMENT</td>
</tr>
<tr>
  <td>C</td>
  <td>11.60</td>
  <td>POST</td>
</tr>

</table>

1 个答案:

答案 0 :(得分:0)

SELECT from_unixtime(logDate/1000) as logDate, userId 
FROM UserLogs UL1
INNER JOIN (SELECT userID, from_UnixTime(logDate/1000) logDate, count(1) cnt 
            FROM userLogs 
            GROUP BY  userID, from_UnixTime(logDate/1000)
            HAVING count(1)>1) UL2
  on UL1.userID = UL2.UserID 
 and UL1.LogDate = from_unixtime(UL1.logDate/1000)
WHERE logDate > subdate(now(), INTERVAL 1 day ) 

这样做会为具有多个条目的用户生成用户天数的子集。然后它返回到基本集,以便在那些日期返回用户的所有8条记录;排除只有1的用户。

您可以使用可能稍微快一些的exists语句而不是连接。