我有这种表
| SessionId | Action |
----------------------
| 1 | LOGIN |
| 1 | INDEX |
| 3 | LOGIN |
| 1 | SHOW |
| 3 | DELETE |
| 1 | INSERT |
| 6 | LOGIN |
| 3 | LOGOUT |
| 5 | LOGIN |
对于已LOGIN
行动的每个SessionId
,我需要获取所有操作的计数而不LOGIN
。
| SessionId | count |
---------------------
| 1 | 3 |
| 3 | 2 |
| 5 | 0 |
| 6 | 0 |
我现在正在使用sql server(Mysql语法没问题)
答案 0 :(得分:3)
编辑:添加了LEFT JOIN,以便结果中包含SessionId值5和6。这也有消除子查询的好处。
SELECT t.SessionId, COUNT(tc.Action)
FROM YourTable t
LEFT JOIN YourTable tc
ON t.SessionId = tc.SessionId
AND tc.Action <> 'LOGIN'
WHERE t.Action = 'LOGIN'
GROUP BY t.SessionId;
答案 1 :(得分:2)
我使用SQlite3执行了此查询:
SELECT SessionId, COUNT(*) AS ActionCount
FROM sessions
WHERE SessionId IN (
SELECT DISTINCT SessionId
FROM sessions
WHERE Action = 'LOGIN')
AND Action <> 'LOGIN'
GROUP BY SessionId;
结果:
1|3
3|2
它不包括只有LOGIN
类型的操作的会话,这与会议要求不同。
答案 2 :(得分:1)
你可以这样做:
SELECT SessionId, COUNT(Action) AS Count
FROM Table
WHERE Action <> "LOGIN"
GROUP BY SessionId
GROUP BY
会使结果按特定列的值进行分组。
请参阅:http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html