首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mysql联接计数

Mysql联接计数
EN

Stack Overflow用户
提问于 2010-03-31 22:30:02
回答 2查看 136关注 0票数 0

我有两个mysql表:

代码语言:javascript
运行
复制
Question with the following columns : id, question, nranswers

Nranswers必须是介于1到5之间的数字

另一张表是

代码语言:javascript
运行
复制
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他没有计算那些没有被选择的答案,只计算那些至少被选择了一次的答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-31 22:49:02

我擅自添加了question_id列,该列将用于将每个答案与一个问题连接起来。

代码语言:javascript
运行
复制
Question with the following columns : id, question, nranswers
Answers with the following columns: question_id, userid, answer

以下是您的查询:

代码语言:javascript
运行
复制
SELECT answer, COUNT(*) AS answer_count
FROM Answers
GROUP BY answer
WHERE question_id = 22
ORDER by answer

然而,如果nranswers是3,但是没有人选择3作为他们的答案,它将不会显示。此查询仅显示选择的答案。

编辑:

要获得所有可用答案的计数,而不仅仅是所选答案,最简单的方法(查询)是删除Question.nranswers列并添加表QuestionAnswers:

代码语言:javascript
运行
复制
QuestionAnswers with the following columns: question_id, answer

QuestionAnswers中的数据如下所示:

代码语言:javascript
运行
复制
quesiton_id answer
-------------------
22          1
22          2
22          3

因此,您将列出每个问题的所有可能答案。

查询将是这样的:

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2010-04-01 00:23:13

this question的一个答案为例,看起来您需要一个临时表来选择MySQL中的一个数字范围。看起来this answer可以很好地扩展。

让我们假设你的问题最多有十个答案。然后,您可以执行以下操作:

代码语言:javascript
运行
复制
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。应该不需要进行其他更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2553776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档