Quan hệ 1-nhiều

Quan hệ 1-nhiều

Ví dụ chúng ta tạo ra hai bảng UserTask trong đó mỗi user có nhiều task (công việc). Và mỗi task thì thuộc về một user nào đó.

  • Ta gọi bảng User có mối quan hệ hasMany với bảng Task.
  • Bảng Task có mối quan hệ belongTo với bảng User.

Thiết kế bảng

Việc thiết kế bảng không khác gì thiết kế bảng với quan hệ 1-1

 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
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS tasks;

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

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

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

INSERT INTO tasks (user_id, name, is_finished) VALUES 
  (1, 'học toán', TRUE),
  (1, 'học tiếng anh', FALSE),
  (1, 'làm việc nhà', FALSE),
  (2, 'làm việc nhà', TRUE);

Để ý là bảng tasks chứa id của bảng users. Và mỗi users có thể có nhiều giá trị trùng nhau trong bảng tasks.

Truy vấn dữ liệu

Để lấy tên và công việc của từng người trong ví dụ trên chúng ta sử dụng:

1
2
3
4
SELECT tasks.id, users.name, tasks.name AS task, tasks.is_finished
  FROM users
  INNER JOIN tasks
  ON users.id = tasks.user_id;

Kết quả sẽ là:

+----+------------------------+-------------------+-------------+
| id | name                   | task              | is_finished |
+----+------------------------+-------------------+-------------+
|  1 | Nguyễn Ngọc Tuấn       | học toán          |           1 |
|  2 | Nguyễn Ngọc Tuấn       | học tiếng anh     |           0 |
|  3 | Nguyễn Ngọc Tuấn       | làm việc nhà      |           0 |
|  4 | Phan Thanh Bình        | làm việc nhà      |           1 |
+----+------------------------+-------------------+-------------+