从组中选择所有元素

时间:2013-04-01 20:16:14

标签: mysql sql

我有下一张桌子 - Task(id, type, sessionId, termination, scenario) 我有一个sessionId列表。

我想选择此会话常用的所有任务。如果任务具有相同的类型,终止和方案,则它们是等于的。

示例 -

| id | type | sessionId | termination | scenario |
  1     A         20        duration      sc1
  2     B         20       invocation     sc1
  3     C         20        duration      sc2
  4     A         21        duration      sc1
  5     B         21       invocation     sc1

对于sessionId列表等于(20,21) - 我想获得下一个信息

| id | type | sessionId | termination | scenario |
  1     A         20        duration      sc1
  2     B         20       invocation     sc1
  4     A         21        duration      sc1
  5     B         21       invocation     sc1 

具有ids = 1,2,4,5的任务对于会话20和21是常见的。

我设计下一个查询 -

select l.* from Task l 
inner join(select p.* from Task p 
           where 
                p.sessionId in (20,21) 
           group by 
                  p.type, 
                  p.termination, 
                  p.scenario 
           having 
                  count(p.id)=2)s 
on 
   l.type=s.type 
   and l.scenario=s.scenario 
   and l.termination=s.termination;

这是获取此类信息的最佳方式吗?也许有一个更好的查询,它只包含一个select操作并且工作得更快?

2 个答案:

答案 0 :(得分:0)

这是方法。查找与所有会话匹配的所有对类型,终止和方案。然后加入tasks表以获取所有信息:

select t.*
from tasks t join
     (select type, termination, Scenario
      from tasks
      where sessionId in (20, 21)
      group by type, termination, scenario
      having count(distinct sessionId) = 2
     ) tts
     on tts.type = t.type and tts.termiantion = t.termination and tts.scenario = t.scenario
where t.sessionId in (20, 21);

您需要更改列表和2(如果您更改列表的大小)。

答案 1 :(得分:0)

我的下面的代码不限于sessionID的任何特定子集。

SELECT t1.* 
FROM Task AS t1 INNER JOIN Task AS t2 ON t1.type = t2.type AND t1.termination = t2.termination AND
                                   t1.scenario = t2.scenario AND t1.sessionid <> t2.sessionid AND
                                   t1.id <> t2.id
ORDER BY t1.id 

这里的SQL小提琴:http://sqlfiddle.com/#!2/55d7c/9随意尝试。

我有点误解了你的要求吗?