เหลือตารางเข้าร่วมบนตัวมันเอง 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
);

หากคุณต้องการดูทั้งผู้ใช้และผู้อ้างอิง คุณจะต้องรวมคอลัมน์ผู้อ้างอิงของผู้ใช้เข้ากับคอลัมน์ 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