0

我有一个具有以下结构的 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 列相同。

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

我的意思是——一旦我有了第一行,我可以验证“桥接”列信息在数据库中作为“通道”存在,以显示一行。我可以递归地执行此操作(检查每一行是否有另一个桥接通道,但是对于数千个它变得非常慢并且有很多查询。我正在考虑在 channel=Bridged 上对同一个表进行内部连接,然后以某种方式做一个group by什么的...

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

4

4 回答 4

3

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

select *
from channels
where id in (
  select min(id)
  from channels
  group by least(channel, bridged), greatest(channel, bridged))
于 2013-01-14T16:44:18.260 回答
0

加入它自己:

select * from channels c0
join channels c1 on c0.channel = c1.Bridged

于 2013-01-14T16:31:08.317 回答
0

是的,应该做一个自我内部连接。

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

select C1.id, C2.id, C1.Stats, C2.Stats, C1.channel 
from channels C1 inner join channels C2 
on C1.channel = C2.Bridged;
于 2013-01-14T16:31:34.180 回答
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;
于 2013-01-14T16:47:33.363 回答