0

前の質問:同じテーブルの 2 つのアイテム間の関係の SQL クエリ

結合テーブルを使用して同じテーブルのアイテムを関連付けられるようにしたいと考えています。上記の質問と同様ですが、相互にリンクされたテーブルからすべてのアイテムを照会できるかどうか疑問に思っていました。

SqlFiddle

entries
  id
  name
similars (join table connecting two entries)
  one_id
  two_id


car - train 
    \
      bicycle - shopping cart 

「自転車」にリンクされているすべてのアイテムをクエリして、次のような結果を取得することは可能でしょうか?

Entry   | Similar_to 
---------------------
Bicycle | Shopping cart
Bicycle | Car
Bicycle | Train

アップデート:

これを行うには再帰が必要なようですので、mysql から postgresql に移行しました。現在、結合テーブルを使用して両方の方法で再帰を達成する方法を考えています。リンクされたリストで一方向に機能するテーブルのセットアップとクエリを次に示します。

CREATE TABLE entries 
( 
  id serial primary key, 
  name varchar(20)
);

INSERT INTO entries
(name)
VALUES
('Car'),
('Train'),
('Bicycle'),
('Shopping cart'),
('Node'),
('Skis'),
('Skates');

CREATE TABLE similars
(
  one_id int,
  two_id int
);

INSERT INTO similars
(one_id, two_id)
VALUES
(1, 2), 
(1, 3),
(3, 4),
(6, 7);

クエリ、追加の postgresql を追加

WITH RECURSIVE temp AS
(
  SELECT * FROM entries WHERE name = 'Bicycle'

  UNION ALL

  SELECT e.*
  FROM entries AS e
  LEFT JOIN similars AS s 
  ON e.id = s.two_id
  JOIN temp l
  ON s.one_id = l.id
)
SELECT * FROM temp;

これで、うまく機能する結果が得られますが、残りの結果を取得する方法を理解する必要があります。

ID  NAME
3   Bicycle
4   Shopping cart

新しい SQLfiddle。リンクされたリストで両方向に結果を取得する方法を誰かが知っているなら、それは素晴らしいことです。

4

3 に答える 3

0
select e.name as "Entry",
       es.name as "Similar_To"
from entries e
inner join similars s
on e.id = s.one_id
inner join entries es
on s.two_id = es.id

それはあなたが探しているものですか?

于 2013-06-25T19:34:19.560 に答える
0

UNION ALL の代わりに UNION を使用して、すでに移動したエントリを処理する甘い二重リンク リストは、うまく機能しているようです。

INSERT INTO similars
(one_id, two_id)
VALUES
(1, 2), 
(2, 1),
(1, 3),
(3, 1),
(3, 4),
(4, 3),
(6, 7),
(7, 6);

WITH RECURSIVE linked_list AS
(
  SELECT * FROM entries WHERE name = 'Bicycle'

  UNION 

  SELECT e.*
  FROM entries e
  LEFT JOIN similars s 
  ON e.id = s.one_id
  JOIN linked_list l
  ON s.two_id = l.id

)
SELECT * FROM linked_list;

自転車の結果:

ID  NAME
3   Bicycle
1   Car
4   Shopping cart
2   Train

SQLフィドル。完全なリストが取得されました! 単一のリンクでこれを行う方法を誰かが考えていない限り、これを使用します。

于 2013-06-29T17:34:16.970 に答える
0

あなたの質問を適切に理解できれば、次のようなことをしたいと思うでしょう:

SELECT e1.*, e2.* 
FROM similars AS sim
JOIN entries as e1 ON sim.one_id = e1.id
JOIN entries as e2 ON sim.two_id = e2.id
WHERE 'Bicycle' IN (e1.name, e2.name);

IN句は次のように置き換えることもできますe1.name='Bicycle' OR e2.name = 'Bicycle'

于 2013-06-25T19:36:06.457 に答える