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
,这可能是因为原始查询会更快。(当然,你应该先介绍一下。)