通过自己的数据从表中获取

时间:2011-11-17 15:54:06

标签: mysql sql sql-server

我有这种表

| 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语法没问题)

3 个答案:

答案 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