从MySQL中的每两行中选择,使用不同的列进行匹配

时间:2013-01-14 16:26:12

标签: mysql select join group-by

我有一个MySQL表,其结构如下:

 mysql> select id,channel,Stats,Bridged from channels;
 +----------+---------------------------------+---------+-------------------------------+
 | id       | channel                         | Stats   | Bridged                       |
 +----------+---------------------------------+---------+-------------------------------+
 | 21523318 | SIP/5602291658-0007f140         | Up      | SIP/X.Y.Z.Q-0007f13f          >      |
 | 21523321 | SIP/X.Y.Z.Q-0007f13f            | Up      | SIP/5602291658-0007f140       |
 | 21523322 | SIP/5154642553-0007f13a         | Up      | SIP/402-0007f135              |
 | 21523323 | SIP/402-0007f135                | Up      | SIP/5154642553-0007f13a       |

查看每两条记录,它们是配对的:例如ID 21523318的Channel与下一个ID的Bridged列相同。

我的问题是:考虑到该表通常包含数千个条目,我如何为每两个记录选择一行?

我的意思是 - 一旦我有第一行,我可以验证“桥接”列信息在数据库中作为“通道”存在,以显示单行。我可以递归地执行此操作(如果有另一个Bridged通道,则检查每一行,但是对于几千个,它变得非常慢并且有很多查询。 我正在考虑在channel = Bridged上使用相同的表进行内连接,然后以某种方式做一组或者某事......

关于我应该如何进行的任何线索或想法?

4 个答案:

答案 0 :(得分:3)

如果始终交换频道和桥接,这应该适合您:

select *
from channels
where id in (
  select min(id)
  from channels
  group by least(channel, bridged), greatest(channel, bridged))

答案 1 :(得分:0)

加入它自己:

  

从频道c0选择*   在c0.channel = c1.Bridged上加入频道c1

答案 2 :(得分:0)

是的,自我内部联接应该这样做。

此外,您可以在频道上添加索引,桥接。

select C1.id, C2.id, C1.Stats, C2.Stats, C1.channel 
from channels C1 inner join channels C2 
on C1.channel = C2.Bridged;

答案 3 :(得分:0)

我想〜这会快一点......

select a.*
     , b.* 
  FROM channels a 
  JOIN channels b 
    ON b.bridged = a.channel
   AND b.channel = a.bridged
   AND b.id > a.id;