MySQL WHERE TRONG ()


84

Truy vấn của tôi là:

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

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

Có cách nào để có được hàng đó quá không?


7
Vui lòng đăng một ví dụ về các hàng không trả về đúng cách từ truy vấn này. Giả sử bạn không lưu trữ iddưới dạng danh sách được phân tách bằng dấu phẩy hoặc một cái gì đó, nhiều hàng sẽ trả về từ truy vấn của bạn.
Michael Berkowski

1
nó là một danh sách được phân tách 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

1
@ user762683, Vui lòng sử dụng tên hồ sơ thích hợp? và kiểu dữ liệu này là gì id, varchar hay set hay enum?
Starx

1
@Starx Tên hồ sơ mà ai đó sử dụng là doanh nghiệp nào của bạn?
Michael Berkowski

1
@Michael, Xem Âm thanh tương ứng với OP netcasethay vì dễ và chính xác như thế @user762683nào?
Starx

Câu trả lời:


82

Truy vấn của bạn dịch sang

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

Nó sẽ chỉ trả về 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à theo dõi kiểu dữ liệu SET. Sau đó, bạn có thể sử dụng, FIND_IN_SET

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

Không thể tái tạo bất kỳ lỗi nào. Truy vấn được yêu cầu phù hợp với 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ê.
BF

39

Bạn đã thiết kế cơ sở dữ liệu sai và bạn nên dành thời gian để đọc một số điều về chuẩn hóa cơ sở dữ liệu ( wikipedia / stackoverflow ).

Tôi cho rằng bảng của bạn trông giống như thế này

TABLE
================================
| group_id | user_ids | name   |
--------------------------------
| 1        | 1,4,6    | group1 |
--------------------------------
| 2        | 4,5,1    | group2 |    

vì vậy, trong bảng nhóm người dùng của bạn, mỗi hàng đại diện cho một nhóm và trong user_idscột, bạn đã chỉ định tập hợp id người dùng cho nhóm đó.

Phiên bản chuẩn hóa 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ả người dùng với nhóm được chỉ định, hoặc tất cả người dùng trong nhóm, hoặc tất cả các nhóm người dùng hoặc bất cứ điều gì bạn có thể nghĩ đến. Ngoài ra, truy vấn sql của bạn sẽ hoạt động:

/* 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;

Cách này cũng sẽ dễ dàng hơn trong việc cập nhật cơ sở dữ liệu, khi bạn muốn thêm bài tập mới, bạn chỉ cần chèn hàng mới vào group_user_assignment, khi muốn xóa bài tập 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 các bài tập, bạn sẽ phải lấy bộ bài tập của mình từ cơ sở dữ liệu, xử lý nó và cập nhật rồi ghi lại vào cơ sở dữ liệu.

Đây là sqlFiddle để chơi với.


1

bạn phải có bản ghi trong bảng hoặc bản ghi mảng trong cơ sở dữ liệu.

thí dụ:

SELECT * FROM tabel_record
WHERE table_record.fieldName IN (SELECT fieldName FROM table_reference);

Lựa chọn phụ không bắt buộc. IN (1,2,3,4)là hoàn toàn hợp lệ. Ngoài ra, tôi không hiểu điều này giải thích như thế nào "khi bản ghi có nhiều id như 1 và 3, mySQL không trả về hàng đó" trong Câu hỏi.
Scratte
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.