2013-01-14 84 views
0

我有具有以下結構的MySQL表:從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的通道與下一個ID的橋接列相同。

我的問題是:考慮到表格通常包含數千個條目,我怎麼能爲每兩條記錄選擇一行?

我的意思是 - 一旦我有第一行,並且我可以驗證在數據庫中「Bridged」列信息存在爲「channel」,以顯示一行。我可以遞歸地做到這一點(檢查每一行,如果有另一個橋接通道,但數以千計它變得非常緩慢,並且有很多查詢。 我正在考慮與channel = Bridged上的同一個表進行內部連接,然後不知何故做group by或東西...

任何線索或想法,我應該如何進行

+0

選擇。 *,b。* FROM通道a JOIN通道b ON b.bridged = a.channel; – Strawberry

回答

3

如果通道和橋接總是換,這應該爲你工作:

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

它加入到自己:在

SELECT * FROM渠道C0
加入通道C1 c0.channel = c1.Bridged

+0

仍然給我在單獨的行信息 – Dan

0

是的,一個自我內在聯結應該做的。

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

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

仍然給我信息在不同的行:) – Dan

+0

你確定嗎?如果是這樣的話,我想我錯過了一些東西。你能根據你在這個問題中的樣本集顯示所需的輸出嗎? –

+0

21523318 | 21523221 | Up | Up
21523221 | 21523318 | Up | up
以上是你的查詢輸出 – Dan

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; 
+0

爲什麼速度更快,min/least可能與「>」運算符的速度相同? – Dan

+0

是的,你可能是對的,爲什麼不吸取它並看到? – Strawberry

+0

都顯示0.01秒: ) – Dan

相關問題