繁体   English   中英

左连接表本身就是sql

[英]left join table on itself sql

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

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

谢谢

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

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

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

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

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

如果您希望同时查看用户和引用它们的用户,则需要将用户的referby列加入引用它们的人员的id列。 即:

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

这就是你做这件事的原因。

如果您有层次关系,您可以将表连接到自身,这是一个示例架构和查询:

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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM