簡體   English   中英

SQL查詢同一表中的相關項目

[英]SQL query of related 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

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

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

那是您要找的東西嗎?

如果我正確地理解了您的問題,那么您想要執行以下操作:

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'

用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

SQLFiddle 現在已檢索完整列表! 除非有人知道如何通過單個鏈接執行此操作,否則請繼續滾動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM