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 には、次の ID の Bridged 列と同じ Channel があります。

私の質問は、テーブルには通常数千のエントリが含まれていることを考慮して、2 つのレコードごとに 1 行を選択するにはどうすればよいでしょうか?

つまり、最初の行を取得したら、「ブリッジ」列情報がデータベースに「チャネル」として存在することを確認して、単一行を表示できます。私はこれを再帰的に行うことができます(別のブリッジチャンネルがあるかどうか各行をチェックしますが、数千の場合は非常に遅くなり、多くのクエリがあります。channel = Bridgedで同じテーブルと内部結合を行うことを考えていました。グループ化するか何か...

どのように進めるべきかについての手がかりやアイデアはありますか?

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 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 に答える
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 * from channels c0
join channels c1 on c0.channel = c1.Bridged

于 2013-01-14T16:31:08.317 に答える