Đây là một ví dụ khác về bản ghi TOP X trên ví dụ Y. Đối với mỗi câu hỏi, bạn muốn có 4 câu trả lời. LIMIT thực sự cần thiết.
Vì vậy, cách tiếp cận của tôi là áp dụng ngẫu nhiên với các câu hỏi trước để lấy kết quả đó dưới dạng kết quả tập hợp con, sau đó nối kết quả đó với các câu trả lời và giới hạn X trên mỗi Y. VẬY, chúng ta có thể tóm gọn tất cả. Điều quan trọng ở đây là truy vấn bên trong phải được sắp xếp theo thứ tự của ID câu hỏi ... VÀ vòng loại, câu trả lời "Đúng" luôn ở vị trí đầu tiên, nhưng bất kỳ thứ gì sau đó đều được ngẫu nhiên hóa để bao gồm tổng cộng 4 bản ghi.
Sau đó, truy vấn cuối cùng áp dụng mệnh đề WHERE để chỉ bao gồm vị trí trình tự xếp hạng là <=4 (có thể có tất cả 9 câu trả lời được bao gồm cho 1 câu hỏi, nhưng sau đó áp dụng mệnh đề cuối cùng "ORDER BY" để giữ các câu hỏi cùng nhau, nhưng ngẫu nhiên các câu trả lời để "Đúng" không còn được trả lại ở vị trí đầu tiên. Bạn có thể xóa mệnh đề "ORDER BY" bên ngoài này cho mục đích thử nghiệm chỉ để xác nhận chức năng, sau đó thêm lại vào sau.
select
FinalQA.*
from
( select
QWithAllAnswers.*,
@RankSeq := if( @LastQuestion = QWithAllAnswers.id, @RankSeq +1, 1 ) ARankSeq,
@LastQuestion := QWithAllAnswers.id as ignoreIt
from
( SELECT
q.id,
q.question,
q.RandQuestionResult,
a.question_id,
a.answer,
a.correct
FROM
( SELECT q.ID,
q.Question,
q.question_ID,
RAND() as RandQuestionResult
FROM
questions q
WHERE
q.subject_id = 18
ORDER BY RAND()
LIMIT 5) JustQ
JOIN answers a
on q.id = a.question_id
ORDER BY
JustQ.RandQuestionResult,
if( a.correct = 1,0.000000, RAND()
) QWithAllAnswers,
( select @RankSeq := 0, @LastQuestion := 0 ) SQLVars
) FinalQA
where
FinalQA.ARankSeq < 5
order by
FinalQA.RandQuestionResult,
rand()
Vài thay đổi nhỏ ... Đảm bảo tại SQLVars
có :=
cho mỗi nhiệm vụ. Khi tôi đăng ban đầu, tôi đã bỏ đi một ":" có thể gây ra lỗi sai. Tôi cũng đủ điều kiện cho "Order by" bên trong bằng cách sử dụng "a.correct =1" (không có tham chiếu bí danh). Cuối cùng, thay đổi mệnh đề WHERE bên ngoài thành chỉ < 5
thay vì <= 4
. Tôi đã thực hiện NHIỀU nhóm X trên Y tuyệt vời nhất này và biết rằng chúng hoạt động, tôi chắc chắn chỉ thiếu một cái gì đó đơn giản.
Ngoài ra, đã điều chỉnh IF()
ngẫu nhiên để có giá trị đầu tiên dưới dạng số thập phân, nếu không tất cả các ngẫu nhiên được đặt thành 1 (số nguyên) và không bao giờ là phân số ... Ngoài ra, đối với các vấn đề có thể xảy ra khi áp dụng LỆNH, tôi đã truy vấn trước tất cả Q và A đã được sắp xếp trước để nhận được tất cả các câu trả lời Đúng ở vị trí đầu tiên, SAU ĐÓ áp dụng SQLVars
so với tập hợp đó, sau đó hoàn thiện trình tự xếp hạng và sắp xếp.