Về mặt logic, không thể làm những gì bạn muốn, tôi sẽ cố gắng giải thích bằng cách sử dụng lựa chọn đặt hàng của bạn
ORDER BY FIELD(`question_level`, 1, 2, 1, 2, 3, 2, 4, 2, 3, 3)
Vì vậy, ở đây chúng tôi muốn 1
rồi đến 2
rồi đến 1
một lần nữa của question_level
. Bây giờ trong bảng Chúng tôi có các giá trị này. Tôi sẽ quan tâm đến bản thân mình chỉ với question_level # 1, đây là tất cả những gì tôi cần để thể hiện quan điểm của mình.
id | question | question_level
______________________________________
1 | abc | 1
______________________________________
5 | qoindos | 1
______________________________________
Như bạn có thể thấy, chúng tôi có các hàng cho question_level=1
Bây giờ hệ thống sẽ quyết định cấp nào 1
là đầu tiên và là thứ hai. Không có cách nào để quyết định làm thế nào để làm điều này. Vì vậy, bất kể Cơ sở dữ liệu không sắp xếp nó theo cách bạn muốn. Nếu không có thêm thông tin để đưa ra lựa chọn đó, không có cách nào để xây dựng một vòng lặp thậm chí để sắp xếp điều đó. Điều tốt nhất bạn có thể làm là sắp xếp theo khóa chính, sau đó là cấp độ. Điều mà bạn sẽ phải làm ở phía máy chủ nhiều khả năng nhất.
Tôi nghĩ rằng sai lầm mà bạn đã mắc phải ở đây là, bạn cần sử dụng ID duy nhất thực tế của các câu hỏi, nếu bạn có giới hạn về số lượng câu hỏi ở mỗi cấp thì điều đó cần được giải quyết riêng.
Hy vọng rằng điều đó có ý nghĩa.
Nếu bạn đang cố chọn x
số lượng câu hỏi ngẫu nhiên tại n
mức độ có thể được giải quyết khá dễ dàng. Ví dụ nếu bạn muốn
- 2x câu hỏi ở lv 1
- 4x câu hỏi ở lv 2
- 3x câu hỏi ở lv 3
- 1x câu hỏi ở lv 4.
Điều này có thể được giải quyết với bốn truy vấn đơn giản cho cấp độ, trong khi sắp xếp ngẫu nhiên trên trường id và sử dụng mệnh đề giới hạn thích hợp cho cấp độ đó. Bằng cách này, đây là số cấp độ trong câu hỏi của bạn.
NẾU bạn muốn chọn các câu hỏi ngẫu nhiên ở một cấp độ nhất định, bạn có thể muốn làm điều đó với một truy vấn con. RAND()
có một số hình phạt về hiệu suất mà bạn có thể khắc phục bằng cách chỉ ngẫu nhiên khóa chính và sau đó kết hợp trên bảng để kéo phần còn lại của dữ liệu ra sau khi nó được sắp xếp theo thứ tự. Tuy nhiên, bạn nên đánh giá nó.
Vì vậy, một ví dụ về điều đó sẽ là điều này.
SELECT
q1.*
FROM
tbl_questions AS q1
JOIN
(
SELECT
id
FROM
tbl_questions
WHERE
question_level = 1
ORDER BY RAND() LIMIT 2
) AS q2 USING( id )
Mặc dù tôi phải thừa nhận rằng tôi chưa bao giờ thử đây chỉ là một Ý tưởng mà tôi có.