我在这里有一个简单的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次。我的问题是,为什么有人想加入一张桌子呢?这样做的目的究竟是什么?
如果可能的话,请用明确的例子给我最好的解释
谢谢
答案 0 :(得分:4)
这通常在您拥有层次结构时完成。
说出每个员工都有经理的员工表 - 经理用ManagerId
字段表示经理的员工ID。
如果你想看到每个员工,他们的经理,经理的经理等,自我加入就是编写查询的方式。
答案 1 :(得分:3)
假设您要跟踪用户以及将他们引荐到您网站的用户。您可以设计一个用于存储用户的表:
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
这就是你做这件事的原因。
答案 2 :(得分: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;
在这种情况下,您将获得所有子类别及其有关父类别的信息。此模式通常用于在关系数据库中存储层次结构。