Quan hệ nhiều-nhiều

Quan hệ nhiều-nhiều

Ví dụ chúng ta tạo ra hai bảng StudentSubject (môn học) trong đó mỗi học sinh có thể học nhiều môn. Và mỗi môn học thì có thể được nhiều người cùng học.

  • Ta gọi bảng Student có mối quan hệ belongsToMany với bảng Subject.
  • Bảng Subject có mối quan hệ belongsToMany với bảng Student.

Thiết kế bảng

Chúng ta cần thêm một bảng phụ để thiết kế. Bảng phụ chứa id của học sinh cùng với id của subject.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
DROP TABLE IF EXISTS students;
DROP TABLE IF EXISTS subjects;
DROP TABLE IF EXISTS student_subjects;

CREATE TABLE students (
  id INTEGER PRIMARY KEY AUTOINCREMENT, -- SQLite 
  -- id INT AUTO_INCREMENT PRIMARY KEY, -- MySQL 
  -- id SERIAL PRIMARY KEY,  -- PostgreSQL
  name VARCHAR(255)
);

CREATE TABLE subjects (
  id INTEGER PRIMARY KEY AUTOINCREMENT, -- SQLite 
  -- id INT AUTO_INCREMENT PRIMARY KEY, -- MySQL 
  -- id SERIAL PRIMARY KEY,  -- PostgreSQL
  name VARCHAR(255)
);

CREATE TABLE student_subjects (
  student_id INTEGER,
  subject_id INTEGER
);

INSERT INTO students (id, name) VALUES 
  (1, 'Nguyễn Ngọc Tuấn'),
  (2, 'Phan Thanh Bình');

INSERT INTO subjects (id, name) VALUES 
  (1, 'Toán'),
  (2, 'Ngữ Văn'),
  (3, 'Tiếng Anh');

INSERT INTO student_subjects (student_id, subject_id) VALUES 
  (1, 1), -- user 1 học Toán
  (1, 3), -- user 1 học Tiếng Anh
  (2, 2), -- user 2 học Ngữ Văn
  (2, 3); -- user 2 học Tiếng Anh

Truy vấn dữ liệu

Để lấy tên học sinh và môn học của học sinh đó chúng ta dùng JOIN ba bảng với nhau như sau:

1
2
3
4
5
6
SELECT students.name, subjects.name AS subject
  FROM students
  INNER JOIN subjects
  INNER JOIN student_subjects
  ON student_subjects.student_id = students.id
    AND student_subjects.subject_id = subjects.id;

Kết quả sẽ là:

+------------------------+-------------+
| name                   | subject     |
+------------------------+-------------+
| Nguyễn Ngọc Tuấn       | Toán        |
| Nguyễn Ngọc Tuấn       | Tiếng Anh   |
| Phan Thanh Bình        | Ngữ Văn     |
| Phan Thanh Bình        | Tiếng Anh   |
+------------------------+-------------+