Mysql 同一表中相关项的SQL查询

Mysql 同一表中相关项的SQL查询,mysql,sql,postgresql,Mysql,Sql,Postgresql,上一个问题: 我希望能够将同一个表中的项与联接表关联起来。类似于上面的问题,但我想知道是否可以从相互链接的表中查询所有项目 entries id name similars (join table connecting two entries) one_id two_id car - train \ bicycle - shopping cart 是否可以查询所有链接到“自行车”的项目,并获得如下结果: Entry | Similar_to

上一个问题:

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

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
。如果有人知道如何在链表上得到双向的结果,那就太好了

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);

子句中的
也可以替换为
e1.name='Bicycle'或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

。现在检索到完整列表!除非有人知道如何使用单链接,否则请使用此链接

我可能不够聪明,但我不明白你在问什么。你能提供一些样品输出吗?给我想要的东西增加了一些输出好的,我现在就知道了。。您希望自行车在所有情况下都列在第一位。不管它是在相似表的位置1还是位置2,我想你们想要的是重复。在SQL Server中,这将通过递归CTE完成,但我不知道我的SQL是否有这些。您可能会被某种类型的游标卡住。mysql不会。它必须在存储过程中完成。