Chỉ cần lấy 2 cho mỗi danh mục như bạn đã mô tả và một ngẫu nhiên ở cuối. Đây không phải là một truy vấn, mà là một tập hợp kết quả, có thể là thứ bạn cần:
SELECT * FROM (SELECT * FROM questions WHERE category= 1 ORDER BY rand() limit 0,2) as t1
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 2 ORDER BY rand() limit 0,2) as t2
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 3 ORDER BY rand() limit 0,2) as t3
UNION
...
(Lựa chọn lồng nhau cho phép bạn sắp xếp theo rand () cho mỗi danh mục) Cho đến nay vẫn chưa có gì đặc biệt - 2 câu hỏi ngẫu nhiên cho mỗi danh mục.
Phần khó bây giờ là thêm phần tử thứ 15, KHÔNG CÓ chọn bất kỳ cái nào bạn đã có.
Để đạt được điều này với lệnh gọi "một", Bạn có thể làm như sau:
- Lấy bộ con gồm 14 câu hỏi bạn đã chọn như trên.
- Liên kết điều này với một tập hợp những thứ được sắp xếp ngẫu nhiên chưa được phân loại từ cơ sở dữ liệu. (giới hạn 0,15)
-
Chọn tất cả từ kết quả này, giới hạn 0,15.
-
NẾU 14 phần tử đầu tiên của truy vấn con LAST đã được chọn - chúng sẽ bị xóa do
UNION
và một phần tử độc lập thứ 15 được đảm bảo. - Nếu truy vấn bên trong cuối cùng cũng chọn 15 câu hỏi riêng biệt, thì giới hạn bên ngoài 0,15 sẽ chỉ đưa câu hỏi đầu tiên vào kết quả.
Một cái gì đó như:
SELECT * FROM (
SELECT * FROM (SELECT * FROM questions WHERE category= 1 ORDER BY rand() limit 0,2) as t1
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 2 ORDER BY rand() limit 0,2) as t2
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 3 ORDER BY rand() limit 0,2) as t3
UNION
...
UNION
SELECT * FROM (SELECT * FROM questions ORDER BY rand() LIMIT 0,15) as t8
) AS tx LIMIT 0,15
Điều này hơi xấu, nhưng chính xác sẽ làm những gì bạn cần:2 câu hỏi ngẫu nhiên từ MỖI danh mục, và cuối cùng là một câu hỏi ngẫu nhiên CHƯA được chọn từ BẤT KỲ danh mục nào. Tổng cộng có 15 câu hỏi bất kỳ lúc nào.
(Nút bên:Bạn cũng có thể chạy truy vấn thứ hai, sử dụng NOT IN ()
không cho phép các câu hỏi đã chọn sau khi xác định 14 câu hỏi cho 7 loại.)
Chỉnh sửa:Rất tiếc là SQL Fiddle hiện không hoạt động. Đây là một số mã fiddle:
CREATE TABLE questions (id int(10), category int(10), question varchar(20));
INSERT INTO questions (id, category, question)VALUES(1,1,"Q1");
INSERT INTO questions (id, category, question)VALUES(2,1,"Q2");
INSERT INTO questions (id, category, question)VALUES(3,1,"Q3");
INSERT INTO questions (id, category, question)VALUES(4,2,"Q4");
INSERT INTO questions (id, category, question)VALUES(5,2,"Q5");
INSERT INTO questions (id, category, question)VALUES(6,2,"Q6");
INSERT INTO questions (id, category, question)VALUES(7,3,"Q7");
INSERT INTO questions (id, category, question)VALUES(8,3,"Q8");
INSERT INTO questions (id, category, question)VALUES(9,3,"Q9");
INSERT INTO questions (id, category, question)VALUES(10,4,"Q10");
INSERT INTO questions (id, category, question)VALUES(11,4,"Q11");
INSERT INTO questions (id, category, question)VALUES(12,4,"Q12");
INSERT INTO questions (id, category, question)VALUES(13,5,"Q13");
INSERT INTO questions (id, category, question)VALUES(14,5,"Q14");
INSERT INTO questions (id, category, question)VALUES(15,5,"Q15");
INSERT INTO questions (id, category, question)VALUES(16,6,"Q16");
INSERT INTO questions (id, category, question)VALUES(17,6,"Q17");
INSERT INTO questions (id, category, question)VALUES(18,6,"Q18");
INSERT INTO questions (id, category, question)VALUES(19,7,"Q19");
INSERT INTO questions (id, category, question)VALUES(20,7,"Q20");
INSERT INTO questions (id, category, question)VALUES(21,7,"Q21");
Truy vấn
SELECT * FROM (
SELECT * FROM (SELECT * FROM questions WHERE category= 1 ORDER BY rand() limit 0,2) as t1
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 2 ORDER BY rand() limit 0,2) as t2
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 3 ORDER BY rand() limit 0,2) as t3
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 4 ORDER BY rand() limit 0,2) as t4
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 5 ORDER BY rand() limit 0,2) as t5
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 6 ORDER BY rand() limit 0,2) as t6
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 7 ORDER BY rand() limit 0,2) as t7
UNION
SELECT * FROM (SELECT * FROM questions ORDER BY rand() LIMIT 0,15) as t8
) AS tx LIMIT 0,15
dữ liệu ví dụ chứa 3 câu hỏi cho mỗi loại, dẫn đến kết quả là câu hỏi thứ 15 (hàng cuối cùng) LUÔN LUÔN là câu hỏi còn lại trong một danh mục.