2013-02-20 2 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

Например, попробуйте google 'running total'. –

ответ

4

Это обычно делается, когда у вас есть иерархия.

Скажите таблицу сотрудников, где у каждого сотрудника есть менеджер - менеджер обозначается полем ManagerId, которое является идентификатором сотрудника менеджеров.

Если вы хотите, чтобы каждый сотрудник, их менеджер, менеджер менеджеров и т. Д., Самостоятельно присоединился, был бы способом написать запрос.

3

Предположим, вы хотите отслеживать пользователей, а также тех, кто ссылался на ваш сайт. Вы можете создать таблицу для хранения пользователей, как это:

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

Если после этого вы хотели посмотреть, как пользователь, и кто передал их, вы должны присоединиться к колонке referredby пользователя в столбце Идентификатор лица которые их называли. то есть:

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; 

в этом случае вы получите все дочерние категории с их информацией о родительских категориях. Этот шаблон часто используется для хранения иерархических структур в реляционной базе данных.