Mysql 从组中选择所有图元

Mysql 从组中选择所有图元,mysql,sql,Mysql,Sql,我有下一个表-任务(id、类型、会话id、终止、场景) 我有一个会话ID的列表 我想选择所有任务,这是本次会议的常见任务。如果任务具有相同的类型、终止和场景,则它们是相等的 示例- | id | type | sessionId | termination | scenario | 1 A 20 duration sc1 2 B 20 invocation sc1 3 C

我有下一个表-
任务(id、类型、会话id、终止、场景)
我有一个会话ID的列表

我想选择所有任务,这是本次会议的常见任务。如果任务具有相同的类型、终止和场景,则它们是相等的

示例-

| 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
list equals(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 
ID=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
操作,运行速度更快?

以下是方法。查找匹配所有会话的类型、终止和场景的所有对。然后重新加入
任务
表以获取所有信息:

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
(如果您更改列表的大小)。

我下面的代码不限于
会话ID的任何特定子集

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 
选择t1.*
从任务作为t1内部连接任务作为t1上的t2。type=t2.type和t1.termination=t2.termination和
t1.scenario=t2.scenario和t1.sessionid t2.sessionid和
t1.id t2.id
按t1.id排序
下面是SQLFIDLE:请随意尝试


我是否有点误解了您的要求?

这是一个好决定!但有没有办法不使用2个“选择”操作呢?您的决定取决于sessionId列表的大小。它可以是两个以上的会话)我的意图是构建一个不依赖于会话数量的查询:查找所有与3个关键字段匹配且与
id
sessionid
不匹配的查询。这是一种错误的方法吗?您可以在(20,21)中添加
和t1.sessionid,在(20,21)中添加t2.sessionid
。如果您有多个会话ID,那么在任何情况下都需要加入一个
groupby
,这可能是因为原始查询会更快。(当然,你应该先介绍一下。)