SQL - 如何进行类似连接的操作?

时间:2016-08-07 16:12:42

标签: mysql sql

对于无法提供信息的标题,我不知道如何命名此操作。这是一个我希望能提供帮助的例子。

我们有用户,我们为其记录事件。事件可以是不同类型的。我们想要生成一个报告(一个新表),它将说明一个事件是否发生在用户身上;例如:

Events             x  EventInfo            =  UserEvent     
---                   ---                     ---
UserId  | EventId     EventId | Type          UserId | login | verify
------------------    -----------------       ------------------------           
1       | 1           1       | login         1      | True  | True
1       | 2           2       | verify        2      | False | False
2       | 3           3       | login            

其他限制:

  • 我们事先并不知道事件类型(他们的名字或不同类型的数量)
  • 必须完全在数据库中发生

1 个答案:

答案 0 :(得分:1)

你想要做的是表pivot的一种形式。以下是使用conditional aggregation的一个选项:

select e.userid, 
   max(case when ei.type = 'login' then 'True' else 'False' end) as login,
   max(case when ei.type = 'verify' then 'True' else 'False' end) as verify
from events e 
   join eventinfo ei on e.eventid = ei.eventid
group by e.userid 

如果outer join表中的记录在event表中不存在,则可能需要eventinfo

如果你不知道type,你将不得不使用dynamic sql,那里有很多例子: