确定SQL中“缺少”后续条目的条目

时间:2013-07-24 09:07:29

标签: mysql

我在SQL中有一个代表某种事件的表。我尝试确定特定事件未被另一个特定事件“跟踪”的所有行。 在下表中,这将是有人注册但之后没有注销的所有行(Lucy和Joe)。这是用SQL实现的,如果可以的话?

|Id|Name      |Event     |
==========================
|01|Fred      |Sign up   |
-------------------------
|02|Joe       |Sign up   |
--------------------------
|03|Lucy      |Sign up   |
--------------------------
|04|Joe       |Do foo    |
--------------------------
|05|Joe       |Sign out  |
--------------------------
|06|Joe       |Sign up   |
--------------------------
|07|Fred      |Sign out  |
--------------------------

非常感谢

3 个答案:

答案 0 :(得分:3)

SELECT x.* 
  FROM events x 
  LEFT 
  JOIN events y 
    ON y.name = x.name 
   AND y.id > x.id 
   AND y.event ='sign out' 
 WHERE x.event = 'sign up' 
   AND y.id IS NULL;

或类似的东西

答案 1 :(得分:1)

select * from 
table as t1 left outer join table as t2
on(t1.name=t2.name and t2.event='sign out')
where
t1.event='sign up' and t2.name is null

除非你定义它所以你需要提供更多信息,否则没有“跟着”之类的东西。 (可能在ON子句中添加“t1.id> t2.id”)

答案 2 :(得分:1)

我想出的最近的事情是看谁有一个完整的“登录”“退出”对。

SELECT Id, Name
FROM 
    EVENTS
WHERE
     event = 'Sign up' or event = 'Sign out'
group by
    Name
having Mod(count(*), 2) <> 0