2013-02-20 52 views
3

我在這裏有一個簡單的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倍。我的問題是這樣的,有人想爲什麼會加入一個表上本身?做這種事的目的究竟是什麼?

請給我一份有明顯的例子最好的解釋如果可能的話

謝謝

+0

例如,嘗試谷歌'運行total'。 – 2013-02-20 22:01:27

回答

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; 

在這種情況下,你會得到所有的子類別與他們的父類的信息。這種模式通常用於在關係數據庫中存儲分層結構。