2012-03-16 40 views
48

truy vấn của tôi là:MySQL Ở ĐÂU TRÊN()

SELECT * FROM table WHERE id IN (1,2,3,4);

tôi sử dụng nó cho các nhóm làm và một người sử dụng có thể ở nhiều nhóm. nhưng có vẻ như khi một bản ghi có nhiều id như 1 và 3, thì mySQL không trả về hàng đó.

Có cách nào để nhận hàng đó không?

+6

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. –

+1

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

+0

@ 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

Trả lời

52

truy vấn của bạn dịch để

SELECT * FROM table WHERE id='1' or id='2' or id='3' or id='4'; 

Nó sẽ chỉ trả lại kết quả phù hợp với nó.


Một cách để giải quyết nó tránh sự phức tạp sẽ là, hãy chaning kiểu dữ liệu là SET. Sau đó, bạn có thể sử dụng, FIND_IN_SET

SELECT * FROM table WHERE FIND_IN_SET('1', id); 
+0

Không thể tạo lại bất kỳ lỗi nào. Truy vấn được yêu cầu hoạt động cho tôi. Tôi nhận được TẤT CẢ các bản ghi từ 'bảng' với các id được liệt kê. –

22

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.