0

SQL で抱えているちょっとした問題について助けが必要です。
現在、MySQL 5.6.12
を搭載した 32 ビットの Wamp サーバーを使用しています。2 つのテーブルがあります。1 つは id (主キー) とその他のものを含み、2 番目のテーブルは最初のテーブルの nn 関係の結果であり、バグが発生する可能性があることを示します。別のクローンになります。

私がしなければならない
ことは、「複製された」バグの ID が隣にあるフィールドを持つバグのリストを取り出すことです。

私がすでに持っているもの:
私は解決策の一部を持っています。クローン化されたバグの一部を 1 つのバグに添付し、クローン化されたバグをリストから削除することに成功しました。実際のコードを提供したいと思いますが、持っていません。今はそうですが、ここでは(記憶による)次のようになります。

select bug_table.id, clones_table.clone
from bug_table 
left outer join 
(
    select source_bug_id, Group_Concat(DISTINC cast(destination_bug_id AS string)) as clone
    from relationship_table
    Group by source_bug_id
)  clones_table
On bug_table_id=source_bug_id
where id not in
(
    select destination_bug_id
    from relationship_table
)

このクエリは 2 つのサブクエリから作成されます。1 つ目は「クローン ID」のリストを「オリジン ID」に追加するためのもので、2 つ目はそれらの「クローン ID」を実際の結果から削除するためのもの
です。だから私の問題は: それだけですクローンの表の片側を見てください。言葉で説明する方法がわからないので、例を挙げて
みましょう 4 つのバグがあり、id 1、2、3、4 があり、それらはすべてクローンですお互いの関係の表に私は持っています

source_bug_id   |destination_bug_id  
1               |2  
1               |3  
1               |4  

したがって、これを使用してクエリをスローすると、次のように出力されます。

id      |clone  
1       |2,3,4

まさに私が欲しいものですが、テーブルにこれが含まれている場合:

source_bug_id   |destination_bug_id  
1               |2  
3               |2  
4               |2  

それは私を出力します

id      |clone  
1       |2  
3       |2  
4       |2  

そして、確かに、それは私が望んでいるものではありません... 私の問題を解決するために私がすでに考えていること: 私のクエリでは、サブクエリを追加して、「from relationship_table」を置き換えて、テーブルを適切な形で準備することができます。のようなものかもしれません

(
    select * 
    from relationship_table
    group by destination_bug_id
)
union
(
    select t1.destination_bug_id , t2.source_bug_id
    from relationship_table as t1 inner join relationship_table as t2 on t1.destination_bug_id = t2.source_bug_id
    where t1.source_bug_id not in
    (
        select source_bug_id
        from relationship_table
        group by destination_bug_id
    )
)

私はそれをテストしませんでしたが、最初のサブクエリはすべてのdestination_bug_idをグループ化して、それらが一意であることを確認する必要があり、2番目のサブクエリは、欠落している行が元に戻った可能性があります:/

検索しましたが、英語の用語にあまり詳しくないので、答えを教えてくれる主題を見逃す可能性があります。

4

1 に答える 1

0

SQL でそれを実行してもよろしいですか?

バグ 1 がバグ 2 のクローンであり、バグ 2 がバグ 3 のクローンであるなどの場合はどうなりますか..:

Id    CloneId
1        2
2        3
3        4

結果が欲しいはずです

Id     Clones
1      2, 3, 4

これは再帰的な検索になり、SQL では非常に複雑になります。おそらく、PHP または使用している言語でそれを行いたいと思うでしょう。

あなたの場合、フィールドを反転するだけのクエリを次に示します。部分的な結果が得られます。

select source_bug_id, 
       Group_Concat(destination_bug_id) as clone
from
(
  (
      select source_bug_id, destination_bug_id
      from relationship_table
  )
  union
  (
      select destination_bug_id, source_bug_id
      from relationship_table
  )
) as alls
group by source_bug_id

SOURCE_BUG_ID       CLONE
1                   2
2                   1,3,4
3                   2
4                   2

SQL フィドル

于 2013-10-16T07:35:43.430 に答える