前の質問:同じテーブルの 2 つのアイテム間の関係の SQL クエリ。
結合テーブルを使用して同じテーブルのアイテムを関連付けられるようにしたいと考えています。上記の質問と同様ですが、相互にリンクされたテーブルからすべてのアイテムを照会できるかどうか疑問に思っていました。
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。リンクされたリストで両方向に結果を取得する方法を誰かが知っているなら、それは素晴らしいことです。