在SQL中左连接自身表格

4

我这里有一个简单的 SQL 问题,我看到一些查询像这样:

SELECT 
    users.id, users.username, users.password
FROM
    users AS User
        LEFT JOIN
    users AS User0 ON ...
        LEFT JOIN
    users AS User1 ON ...
        LEFT JOIN
    users AS User2 ON ...
WHERE
    ...
ORDER BY ... DESC

在上面可以看到,同一个表users被左连接了3次。我的问题是,为什么有人想要将表与自身连接?这样做的目的是什么?
如果可能的话,请给我最好的解释和清晰的示例。
谢谢。

例如,尝试谷歌搜索“累计总和”。 - Hamlet Hakobyan
3个回答

4

通常这是在有层级结构的情况下完成的。

假设有一个员工表,每个员工都有一个经理 - 经理用一个ManagerId字段表示,该字段为经理的员工ID。

如果您想查看每个员工、他们的经理、经理的经理等情况,自连接就是编写查询的方法。


3
假设您想追踪用户以及引荐他们访问您的网站的人。您可以设计一个用于存储用户的表格,如下所示:

create table users (
    id int unsigned primary key auto_increment,
    name varchar(100),
    ...
    referredby int unsigned
);

如果您想查看用户和介绍他们的人,您需要将用户的“referredby”列与介绍他们的人的“id”列进行连接,即:
SELECT u.name user, r.name referrer
    FROM users u LEFT JOIN users r ON u.referredby = r.id

所以这就是你要这样做的原因。

1
如果您有一个层级关系,您可以将表连接到自身,这里是一个示例模式和查询:
CREATE TABLE category (
      id int NOT NULL auto_increment,
          primary key(id),
      category_name varchar(64) NOT NULL,
      parent_category_id int DEFAULT NULL,
          foreign key(parent_category_id) references category(id)
) engine=innodb;

假设你有一个商店,里面有各种产品类别。在这个例子中,你正在浏览不同的类别,并且想要显示每个父类别下的所有子类别:
 SELECT parent_category.id AS parent_category_id, 
        parent_category.category_name AS parent_category_name,
        child_category.id AS category_id,
        child_category.category_name AS category_name
 FROM
        category AS parent_category
        LEFT OUTER JOIN category AS child_category ON child_category.parent_category_id = parent_category.id;

在这种情况下,您将获得所有子类别及其有关父类别的信息。这种模式通常用于在关系数据库中存储分层结构。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接