【问题标题】:SQL query of related items from the same table同表相关项的SQL查询
【发布时间】:2013-06-30 01:34:16
【问题描述】:

上一个问题: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。如果有人知道如何在链表上获得双向结果,那就太好了。

【问题讨论】:

  • 我可能不够聪明,但我不知道你在问什么。你能提供一些示例输出吗?
  • 为我要查找的内容添加了一些输出
  • 好的,我现在明白了.. 您希望在所有情况下都将自行车排在第一位。无论它是在相似表的第 1 位还是第 2 位。
  • 我想你想要的是回避。在 SQL Server 中,这将通过递归 CTE 完成,但我不知道我的 sql 是否有这些。您可能会遇到某种类型的光标。
  • mysql 没有。它必须在存储过程中完成。

标签: mysql sql postgresql


【解决方案1】:
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

这就是你要找的吗?

【讨论】:

    【解决方案2】:

    如果我正确理解你的问题,你想做这样的事情:

    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'

    【讨论】:

      【解决方案3】:

      使用 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。现已检索到完整列表!除非有人知道如何使用单个链接执行此操作,否则请使用此链接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多