来自同一个表的相关项的SQL查询

时间:2013-06-25 19:13:58

标签: mysql sql postgresql

上一个问题:SQL query of relationship between two items from the same table

我希望能够将同一个表中的项目与联接表相关联。与上面的问题类似,但我想知道是否可以查询彼此链接的表中的所有项目。

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。如果有人知道如何获得结果,那么链接列表上的两个方向都会很棒。

3 个答案:

答案 0 :(得分: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

这就是你要找的东西吗?

答案 1 :(得分: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'

答案 2 :(得分: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

SQLFiddle。现在检索完整列表!滚动这个,除非有人知道如何用单链接做到这一点。