【问题标题】:Mysql JOIN countsMysql JOIN 计数
【发布时间】:2010-03-31 14:30:02
【问题描述】:

我有 2 个 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 他不计算未选择的答案,只计算至少选择一次的答案。

【问题讨论】:

  • 这两个表没有关系。你有没有错过一张桌子?
  • 如前所述,没有足够的信息来连接这两个表。您需要一些方法来绑定它所针对的问题的答案,例如 Answers 中的 question_id。
  • 您应该在 Answers 表中添加 question_id 列。
  • nranswers 确定用户可以选择多少个答案。如果是5,那么用户有五个答案可供选择。
  • 答案表也包含一个 questionid...

标签: mysql join inner-join


【解决方案1】:

我冒昧地添加了 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

【讨论】:

  • 已经这样做了,但它没有显示未选择的回复。例如,如果我们有 25 个用户的答案为 1,它会显示:1-25,我也需要它来回显 2-0、3-0、4-0、5-0。如果 nranswers 是 3,它必须显示 1-25、2-0、3-0,所以我需要以某种方式限制它,并且也显示零
  • @FinalDestiny,我用一种适应这种情况的方法更新了我的答案。
【解决方案2】:

选择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。无需进行其他更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2014-01-12
    • 1970-01-01
    • 2023-03-30
    • 2012-04-04
    • 1970-01-01
    相关资源
    最近更新 更多