2013-06-25 53 views
0

上一個問題:SQL query of relationship between two items from the same table來自同一表的相關項目的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 

New SQLfiddle。如果有人知道如何獲得結果,那麼鏈接列表上的兩個方向都會很好。

+2

我可能不夠聰明,但我無法弄清楚你在問什麼。你能提供一些樣本輸出嗎? –

+0

增加了一些輸出,我會尋找 – WhoDidThis

+0

好吧,我現在得到它..你想要自行車在所有情況下首先列出。無論它是否位於類似表格的位置1或2。 – xQbert

回答

0

甜,雙向鏈表與UNION而不是UNION ALL來處理已經旅行的條目似乎工作正常。

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 

​​。完整列表現在檢索!除非有人知道如何通過單個鏈接來做到這一點,否則請隨着這個滾動。

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 

這是你在找什麼?

0

如果我理解proprly你的問題,你想要做這樣的事情:

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'