互斥对

时间:2014-11-22 23:30:59

标签: mysql sql

我需要一个根据条件将用户配对的查询。查询将返回动态的行数,等于符合条件的对的数量。该查询返回两个字段id1id2,每个字段都是用户的ID。如何创建查询以便id不会再显示在另一行?

我要返回的示例:

id1 id2
001 003
004 006
009 011
023 042

想要返回的示例:

id1 id2
001 003
003 004
012 002
023 012

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你有一些表,比如Users,你想要配对用户。您可能还有where条款或其他条件。

你实际上可以做到这一点。枚举行,然后基于组合相邻的偶数和奇数值进行条件聚合:

select min(u.userid) as userid1, max(u.userid) as userid2
from (select u.*, (@rn := @rn + 1) as seqnum
      from users u cross join 
           (select @rn := 0) vars
     ) u
group by floor((seqnum - 1) / 2)
having userid1 <> userid2;

您可以在子查询中轻松添加where子句。