4

SQL Serverで再帰への参照を見てきましたが、MySQLを使用しており、結果を1つの列に含める必要があります。人間関係の表がある場合:

itemID1 | itemiD2
---------------
  1     |   2
  1     |   3
  4     |   5

いずれかの列で単一のIDに関連するすべてのIDを選択するにはどうすればよいですか?例えば:

1 ==> 2,3

3 ==> 1,2

自己結合を試しましたが、関連するすべてのIDを1つの列で取得できません。このためのより良いスキーマがあれば、テーブルを変更するのに遅すぎることはありません。

ありがとうございました。

4

2 に答える 2

5

このクエリを試してください:

select
    itemID1, group_concat(cast(itemID2 as char) separator ',')
from
(
    select itemID1, itemID2 from st where itemID1 = :ID
    union 
    select itemID2, itemID1 from st where itemID2 = :ID
    union
    select s1.itemID2, s2.itemID2 from st as s1 inner join st as s2 on s1.itemID1 = s2.itemID1
    where s1.itemID2 = :ID
    union
    select s1.itemID1, s2.itemID1 from st as s1 inner join st as s2 on s1.itemID2 = s2.itemID2
    where s1.itemID1 = :ID
) as subquery
where itemID1 <> itemID2
group by itemID1

このようにして、両方の方法で関係を選択し(union独自性を提供します)、結合されたアイテム間の関係も(両方の方法で)選択します。

于 2012-07-26T11:21:19.003 に答える
0

質問に対する部分的な回答。これは再帰ではなく、推移性に対処します。

select itemID1, itemID2
from ((select itemID1, itemID2
       from t
      ) union all
      (select itemID2, itemID1
       from t
      )
     ) t
group by itemID1, itemID2

それらをリストとして取得するには:

select itemID1, group_concat(distinct cast(itemID2 as varchar(32)) separator ',')
from ((select itemID1, itemID2
       from t
      ) union all
      (select itemID2, itemID1
       from t
      )
     ) t
group by itemID1, itemID2
于 2012-07-26T11:04:53.513 に答える