我有两个mysql表:
Question with the following columns : id, question, nranswers
Nranswers必须是介于1到5之间的数字
另一张表是
Answers with the following columns: questionid, userid, answer .
现在的问题是,我想要得到一个问题(假设id 22 )的每个答案的答案。
附注:如果nranswers为3,则结果应如下所示:
(正确的数字表示选择回复号码的次数)
1-2
2-8
3-7
如果nranswers为5,则结果应如下所示:
1-3
2-8
3- 14
4- 19
5-8
请帮我解决这个问题,atm他没有计算那些没有被选择的答案,只计算那些至少被选择了一次的答案。
发布于 2010-03-31 22:49:02
我擅自添加了question_id列,该列将用于将每个答案与一个问题连接起来。
Question with the following columns : id, question, nranswers
Answers with the following columns: question_id, userid, answer
以下是您的查询:
SELECT answer, COUNT(*) AS answer_count
FROM Answers
GROUP BY answer
WHERE question_id = 22
ORDER by answer
然而,如果nranswers是3,但是没有人选择3作为他们的答案,它将不会显示。此查询仅显示选择的答案。
编辑:
要获得所有可用答案的计数,而不仅仅是所选答案,最简单的方法(查询)是删除Question.nranswers列并添加表QuestionAnswers:
QuestionAnswers with the following columns: question_id, answer
QuestionAnswers中的数据如下所示:
quesiton_id answer
-------------------
22 1
22 2
22 3
因此,您将列出每个问题的所有可能答案。
查询将是这样的:
SELECT qa.answer, COUNT(a.question_id) AS answer_count
FROM QuestionAnswers qa
LEFT OUTER JOIN Answers a
ON qa.question_id = a.question_id AND a.answer = qa.answer
GROUP BY qa.answer
WHERE qa.question_id = 22
ORDER by qa.answer
发布于 2010-04-01 00:23:13
以this question的一个答案为例,看起来您需要一个临时表来选择MySQL中的一个数字范围。看起来this answer可以很好地扩展。
让我们假设你的问题最多有十个答案。然后,您可以执行以下操作:
SELECT Choices.num,IF(Answers.answer IS NULL,0,COUNT(*))
FROM
(SELECT choice.num,Question.*
FROM
(SELECT 1 num
UNION ALL
SELECT 2 num
UNION ALL
SELECT 3 num
UNION ALL
SELECT 4 num
UNION ALL
SELECT 5 num
UNION ALL
SELECT 6 num
UNION ALL
SELECT 7 num
UNION ALL
SELECT 8 num
UNION ALL
SELECT 9 num
UNION ALL
SELECT 10 num) choice,
Question
WHERE Question.id=22
) Choices
LEFT OUTER JOIN Answers
ON Answers.question_id=Choices.id AND Answers.answer=Choices.num
WHERE Choices.num<=Choices.nranswers
GROUP BY Choices.num;
它很乱,但很管用。如果你需要更多的选择,你可以做一些与上面提到的答案类似的事情。此外,将WHERE Question.id=22
更改为所需的ID。应该不需要进行其他更改。
https://stackoverflow.com/questions/2553776
复制相似问题