Bạn có thiết kế cơ sở dữ liệu sai và bạn sẽ mất một thời gian để đọc một cái gì đó về bình thường hóa cơ sở dữ liệu (wikipedia/stackoverflow).
tôi giả sử bảng của bạn trông hơi như thế này
TABLE
================================
| group_id | user_ids | name |
--------------------------------
| 1 | 1,4,6 | group1 |
--------------------------------
| 2 | 4,5,1 | group2 |
như vậy trong bảng của bạn của nhóm người sử dụng, mỗi hàng đại diện cho một nhóm và trong user_ids
cột mà bạn đã thiết lập của id người dùng được gán cho nhóm đó.
bình thường hóa phiên bản của bảng này sẽ trông như thế này
GROUP
=====================
| id | name |
---------------------
| 1 | group1 |
---------------------
| 2 | group2 |
GROUP_USER_ASSIGNMENT
======================
| group_id | user_id |
----------------------
| 1 | 1 |
----------------------
| 1 | 4 |
----------------------
| 1 | 6 |
----------------------
| 2 | 4 |
----------------------
| ...
Sau đó, bạn có thể dễ dàng chọn tất cả các người dùng với nhóm được giao, hoặc tất cả các thành viên trong nhóm, hoặc tất cả các nhóm người sử dụng, hoặc bất cứ điều gì bạn có thể nghĩ của. Ngoài ra, truy vấn sql của bạn sẽ làm việc:
/* Your query to select assignments */
SELECT * FROM `group_user_assignment` WHERE user_id IN (1,2,3,4);
/* Select only some users */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE user_id IN (1,4);
/* Select all groups of user */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE t1.`user_id` = 1;
/* Select all users of group */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE t1.`group_id` = 1;
/* Count number of groups user is in */
SELECT COUNT(*) AS `groups_count` FROM `group_user_assignment` WHERE `user_id` = 1;
/* Count number of users in group */
SELECT COUNT(*) AS `users_count` FROM `group_user_assignment` WHERE `group_id` = 1;
Bằng cách này nó sẽ còn dễ dàng hơn để cập nhật cơ sở dữ liệu, khi bạn muốn thêm nhiệm vụ mới, bạn chỉ đơn giản là chèn hàng mới trong group_user_assignment
, khi bạn muốn loại bỏ phân bạn chỉ cần xóa hàng trong group_user_assignment
.
Trong thiết kế cơ sở dữ liệu của bạn, để cập nhật bài tập, bạn sẽ phải nhận bài tập từ cơ sở dữ liệu, xử lý và cập nhật rồi viết lại cơ sở dữ liệu.
Đây là sqlFiddle để chơi cùng.
Vui lòng đăng ví dụ về các hàng không trả lại đúng từ truy vấn này. Giả sử bạn không lưu trữ 'id' dưới dạng danh sách được phân tách bằng dấu phẩy hoặc thứ gì đó, nhiều hàng _will_ sẽ trả về từ truy vấn của bạn. –
cũng là một danh sách tách biệt bằng dấu phẩy, ví dụ => 3,4 sẽ không được trả về bởi mySQL. Tôi thấy vấn đề, đó là về dấu phẩy nhưng làm thế nào tôi có thể làm điều đó? – netcase
@ user762683, Vui lòng sử dụng tên hồ sơ thích hợp? và kiểu dữ liệu của 'id', varchar hoặc set hoặc enum là gì? – Starx