我有 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>
答案 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语句而不是连接。