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 次。我的问题是,为什么有人想自己加入一张桌子?这样做的目的究竟是什么?

如果可能的话,请用清晰的例子给我最好的解释

谢谢

4

3 回答 3

4

这通常在您有层次结构时完成。

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

如果您想查看每个员工、他们的经理、经理的经理等,自联接将是编写查询的方式。

于 2013-02-20T22:00:23.903 回答
3

假设您要跟踪用户,以及将他们引荐到您网站的用户。您可以设计一个用于存储用户的表,如下所示:

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

如果您想同时查看用户和推荐人,您需要将用户的被推荐人列加入到推荐人的 id 列。IE:

SELECT u.name user, r.name referrer
    FROM users u LEFT JOIN users r ON u.referredby = r.id

所以这就是为什么你会这样做。

于 2013-02-20T22:02:14.377 回答
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;

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

于 2013-02-20T22:05:21.543 回答