이것은 Y 예에 대한 TOP X 레코드의 또 다른 예입니다. 모든 질문에 대해 4 개의 답을 원합니다. LIMIT은 실제로 두 번 필요합니다 ... 처음에는 자격을 갖춘 질문을 제한하고 "올바른"대답을 보장하는 대답의 또 다른 "순위"는 질문 결과 집합마다 항상 포함됩니다.
내 접근 방식은 질문에 대해 무작위로 우선 적용하여 하위 집합 결과로 얻은 다음이를 답변에 결합하고 Y를 X로 제한합니다. 그러면 우리는 모든 결과를 얻을 수 있습니다. 여기서 중요한 것은 질문 ID로 내부 쿼리를 정렬해야한다는 것입니다 ... 그리고 한정어는 항상 첫 번째 위치에 있지만 이후의 모든 항목은 총 4 개의 레코드가 포함되도록 무작위로 지정됩니다.
그런 다음 최종 쿼리는 WHERE 절을 적용하여 순위 순서가 < = 4 (가능한 모든 9 개의 대답 중 하나의 질문에 포함됨)를 포함하지만 마지막 "ORDER BY"절을 적용하여 질문을 유지합니다 함께,하지만 답변을 무작위로 "올바른"항상 더 이상 항상 첫 번째 위치에 반환됩니다.이 외부 "ORDER BY"절을 테스트 목적으로 제거하여 기능을 확인한 다음 나중에 다시 추가 할 수 있습니다. SQLVars
이 과제의 각 :=
을 가지고에서
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()
커플 작은 변화 ... 있는지 확인합니다. 원래 게시했을 때 잘못된 오류가 발생했을 수있는 하나의 ":"을 남겼습니다. 또한 "a.correct = 1"(별칭 참조가 없음)을 사용하여 내부 "Order By"를 정규화했습니다. 마지막으로 바깥 쪽 WHERE 절을 <= 4
대신 < 5
으로 변경했습니다. 나는 Y 그룹별로 가장 위대한 X 그룹을 많이 만들었고, 그들이 일하는 것을 알고, 확실한 간단한 것을 놓쳤다.
또한 IF()
랜덤 값을 10 진수로 첫 번째 값을 갖도록 조정합니다. 그렇지 않으면 모든 랜덤 스탯이 1 (정수)로 설정되고 절대 절대로 설정되지 않습니다 ... ORDERING이 적용될 때 발생할 수있는 문제에 대해서는 - 모든 Q와 A를 먼저 정렬하여 첫 번째 위치에서 모든 정답을 얻은 다음 해당 세트에 대해 SQLVars
을 적용한 다음 순위 순서와 순서를 마무리합니다.
다른 질문을 시도했지만 실제로 해결할 수 없었습니다. 다른 사람들이 참조하기를 원할 경우를 대비하여 여기까지입니다. http://www.sqlfiddle.com/#!2/34906/34. 어떤 이유로 'answers'에 대한 내부 쿼리의'ORDER BY RAND()'가 작동하지 않습니다. – mellamokb
PHP가 더 좋을 것입니다. MySQL에는 Oracle/SQL Server/PostgreSQL에서 사용할 수있는 언어 구조가 없습니다. – gbn
@gbn : 특히 질문 당 최대 9 개의 답변 만 있기 때문에 동의합니다. 모든 대답을 PHP로 가져 와서 무작위로 처리하는 것도 마찬가지로 쉽습니다. – mellamokb