我有一个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上使用相同的表进行内连接,然后以某种方式做一组或者某事......
关于我应该如何进行的任何线索或想法?
答案 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;