4

ここに簡単な 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 回左結合されています。私の質問はこれです、なぜ誰かが自分自身でテーブルに参加したいのですか? そのようなことをする目的は正確には何ですか?

可能であれば、明確な例を示した最適な説明をお願いします

ありがとうございました

4

3 に答える 3

4

これは通常、階層がある場合に行われます。

各従業員にマネージャーがいる従業員のテーブルを考えてみManagerIdましょう。マネージャーは、マネージャーの従業員 ID であるフィールドで示されます。

各従業員、そのマネージャー、マネージャーのマネージャーなどを確認したい場合は、自己結合を使用してクエリを記述します。

于 2013-02-20T22:00:23.903 に答える
3

ユーザーだけでなく、ユーザーをサイトに紹介した人物を追跡したいとします。次のようなユーザーを格納するためのテーブルを設計できます。

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

次に、ユーザーとその紹介者の両方を表示したい場合は、ユーザーの Referedby 列を、そのユーザーを紹介した人の id 列に結合する必要があります。すなわち:

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

それがあなたがそれをする理由です。

于 2013-02-20T22:02:14.377 に答える
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;

この場合、すべての子カテゴリとその親カテゴリに関する情報を取得します。このパターンは、リレーショナルデータベースに階層構造を格納するためによく使用されます。

于 2013-02-20T22:05:21.543 に答える