оставил таблицу соединений на себе 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 раза. Мой вопрос в том, почему кто-то хочет присоединиться к таблице сам по себе? Какова цель делать что-то подобное?

Пожалуйста, дайте мне лучшее объяснение с четкими примерами, если это возможно

Спасибо


person user765368    schedule 20.02.2013    source источник
comment
Например, попробуйте Google running total.   -  person Hamlet Hakobyan    schedule 21.02.2013


Ответы (3)


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

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

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

person Oded    schedule 20.02.2013

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

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

Вот почему вы бы это сделали.

person DiMono    schedule 20.02.2013

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

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;

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

person hsanders    schedule 20.02.2013