如何使用 MySQL 分别对列进行计数和分组?

2024-01-14

我有一个调查应用程序,正在处理结果页面。对于每个问题,页面应显示提供的不同答案以及每个答案提供的次数。

有些问题可以接受多个答案。例如,假设以下是这样一个问题:

  1. 你感觉怎么样?
  • Good
  • Bad
  • Okay

这意味着任何组合Good, Bad and/or Okay被允许作为答案。

假设调查的回复如下:

  • 调查一:Good, Bad and Okay
  • 调查2:Good, Bad and Okay
  • 调查3:Good and Bad
  • 调查四:Good and Bad
  • 调查5:Good
  • 调查 6:Good
  • 调查7:Good

以下是预期结果:

  1. 你感觉怎么样?
  • Good = 7
  • Bad = 4
  • Okay = 2

我的代码提供了

  1. 你感觉怎么样?
  • Good = 3
  • Bad = 2
  • Good = 4
  • Okay = 1
  • Bad = 2
  • Okay = 1

此示例的数据库条目如下所示:

questionNum question answer1 answer2 answer3 ...
1 How are you feeling? Good Bad Okay
1 How are you feeling? Good Bad Okay
1 How are you feeling? Good Bad
1 How are you feeling? Good Bad
1 How are you feeling? Good
1 How are you feeling? Good
1 How are you feeling? Good

这是我的代码:

my $queryQuery = "SELECT questionNum, question, answer1, answer2, answer3, answer4, answer5, answer6, answer7, answer8, answer9, answer10, COUNT(*) FROM results WHERE title = ? GROUP BY answer1, answer2, answer3, answer4, answer5, answer6, answer7, answer8, answer9, answer10 ORDER BY questionNum";
my $sthm = $dbh->prepare($queryQuery);
$sthm->execute($marathon);

my $prev_question;
while(my($questNumber, $quest, $ans1, $ans2, $ans3, $ans4, $ans5, $ans6, $ans7, $ans8, $ans9, $ans10, $count) = $sthm->fetchrow_array){
print qq{<tr><td> $questNumber. $quest \n </td></tr>} unless $quest eq $prev_question; # the trailing conditional is to get rid of the duplicate questions that print out.
print qq{<tr><td> $ans1 = $count </td></tr>} unless $ans1 eq "";
print qq{<tr><td> $ans2 = $count </td></tr>} unless $ans2 eq "";
print qq{<tr><td> $ans3 = $count </td></tr>} unless $ans3 eq "";
print qq{<tr><td> $ans4 = $count </td></tr>} unless $ans4 eq "";
print qq{<tr><td> $ans5 = $count </td></tr>} unless $ans5 eq "";
print qq{<tr><td> $ans6 = $count </td></tr>} unless $ans6 eq "";
print qq{<tr><td> $ans7 = $count </td></tr>} unless $ans7 eq "";
print qq{<tr><td> $ans8 = $count </td></tr>} unless $ans8 eq "";
print qq{<tr><td> $ans9 = $count </td></tr>} unless $ans9 eq "";
print qq{<tr><td> $ans10 = $count </td></tr>} unless $ans10 eq "";
$prev_question = $quest;
}

在这里,我循环查询以打印出所有不重复的问题,并打印问题的答案(只要它们不为空)。这是我搜索上述输出的位置 1. 你感觉怎么样?好= 7,差= 4,好= 2。
相反,我将答案分为几组,因为用户使用复选框而不是单选按钮为单个问题选择了多个答案。因此,在数据库内部,即使答案已放入自己的列中,它们也是相互连接的,因为它们是由用户选择问题选项的同时输入的。


我知道您同时面临很多事情,但最好的答案解决了这个问题池上很快就过去了 https://stackoverflow.com/a/66773608/2766176他正在用 Perl 做这件事:

这是一个可怕的数据库模式。

人们常常在应用程序级别做的事情比他们需要做的多得多,因为他们从来没有学会在数据库中做正确的事情(例如你的其他问题 https://stackoverflow.com/q/66768033/2766176最好通过适当的 SQL 查询而不是 Perl 来回答)。但是,顺便说一句,许多人这样做是因为他们无法更改架构。社会启发法,例如适当使用啤酒,有时可以使这条道路变得平坦。说服数据库人员的一些工作稍后会得到成倍的回报。另外,“全栈开发人员”通常会忽略数据库的任何复杂使用。

我不会让任何人读 C.J. Date 的深入数据库,但是获得正确的模式有很多价值。正确地说,我的意思是它在使用上花费的精力和复杂性最少。事情应该很简单,并且您不必在应用程序级别重新安排这些事情。

您想要计算每个答案被选择的次数。计数是数据库擅长的事情,所以让数据库来做吧。

你有一些问题。问题有不同的答案。调查将一系列问题组合在一起。人们通过将答案与问题联系起来来回应调查。

这是一个简单的模式设计(一些数据库人员最终会出现并告诉我我做得不对,但没关系)。诀窍在于,任何东西都不必有多个未使用的列。所有内容都在一个整洁的小包中(“关系数据库”中的“关系”),可以通过“外键”(例如用于映射问题答案的 Question_id )轻松连接到其他内容。例如,相同的答案将有多行question_id.

如果有人想使用精美的建模工具来制作图片,那就去做吧。我将其标记为社区维基。

Table: Questions
   id
   text

Table: Answers
   id
   text
   question_id

Table: Surveys
   id 
   title

Table: SurveyQuestionSet
   id
   survey_id
   question_id   

Table: Respondent
   id
   text

Table: Response
   id
   respondent_id
   survey_id
   question_id
   answer_id

一旦绘制出来并正确标准化(阅读范式 https://en.wikipedia.org/wiki/Database_normalization),使用 SELECT 很容易获得所需的数据。标准化的理想就是不重复信息或允许其进入不一致的状态。通过这些形式,许多事情变得更容易做。

而且,如果你想练习这些事情,Stackoverflow 数据浏览器 https://data.stackexchange.com/stackoverflow/query/new是一个根据我在这里展示的内容标准化的现实数据集。

现在你只需数一下次数answer_id显示调查和问题的特定组合。巧妙运用GROUP BY为您完成所有工作。您不再需要遍历行,查看数十个未使用的列,试图弄清楚如何对它们进行计数。不仅如此,你还可以制作这些东西views https://www.mysqltutorial.org/mysql-views-tutorial.aspx/,这意味着您编写一次查询,数据库会假装其结果是一个表。然后您可以简单地查询视图(因此所有JOINs 也同样被隐藏),这很简单。存储过程也经常被忽视。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 MySQL 分别对列进行计数和分组? 的相关文章

  • 如何在 MacOS 上卸载 Mysql Shell

    我错误地安装了 MySql Shellhttps dev mysql com doc mysql shell 8 0 en https dev mysql com doc mysql shell 8 0 en 在我的 MacBook Pro
  • ORDER BY 之后的 GROUP BY

    我需要去做GROUP BY after ORDER BY 我不明白为什么 MySQL 不支持这一点 这是我的代码 SELECT pages id contents id language ORDER BY FIND IN SET langu
  • 错误代码 13,SELECT INTO OUTFILE 问题

    我试图了解使用 INTO OUTFILE 命令时不断遇到问题的原因 我总是收到这个错误 ERROR 1 HY000 Can t create write to file var www p1 txt Errcode 13 SELECT pa
  • 消除 JPA 标准中子查询产生的冗余连接

    我只需要使用 JPA 标准执行以下 MySQL 查询 获取状态列表 来自state table 基于给定的国家名称 在country SELECT state id state name country id FROM state tabl
  • 将此 MySQL 查询转换为 PyGreSQL

    我正在开发一个 Ruby 应用程序 它使用 mysql 函数 XOR 和 BIT COUNT 不过 我现在需要在运行 PyGreSQL 的 Heroku 上运行该应用程序 我找不到任何可以帮助我的 PyGreSQL 文档 那么任何人都可以翻
  • 1:1 关系中的双向外键约束

    我正在使用 MySQL 数据库 在我的关系数据模型中 我有两个相互 1 1 关联的实体 在我的架构中 通过将 FK 字段放入两个表之一中来建立 1 1 关系 该字段与另一个表的 PK 相关 两个表都有 PK 并且都是自动递增的 BIGINT
  • 有没有办法只安装mysql客户端(Linux)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有不需要安装整个mysql db安装包的Linux mysql命令行工具 我想做的是从服务器 1 应用程序服务器 执行将在服务器 2
  • 未知的表引擎“InnoDB”

    最近 我发现如果我有好的硬件 我可以最大限度地提高 mysql 的性能 由于我一直在使用 InnoDB 所以我在 my ini 中添加了额外的配置 以下是新添加的配置 innodb data file path ibdata1 10M au
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • 使用 PHP 显示 Mysql 中的图像

    这就是我的数据库中的表的样子 我正在尝试显示我存储的图像 它是 mimetype longblob 当我运行代码时 它会给我一个带有 的小框 没有错误 只是那个框 有谁知道错误是什么以及如何修复它 Display Index Display
  • 无法将包含数据的大型 CSV 文件转换为 mysql 数据库[重复]

    这个问题在这里已经有答案了 如何将大型文本文件转换为mysql数据库 文件大小3GB 1100万行 文件中的每一行都是这样的 1303179444 20 5811 Ahmed Al Emam male ahmed e alemam ahme
  • 搜索多个表 (SQL)

    我需要能够有一个 SQL 查询来使用简单的搜索来搜索我的数据库 这是我的表格现在的样子 Table artists id name Table albums id artistID name Table songs id albumID n
  • 错误:SQLSTATE[HY000] [2002] 无法建立连接,因为目标计算机主动拒绝连接

    当我调试代码时突然发生错误 它有一系列关于数据库连接的错误 ERROR SQLSTATE HY000 2002 No connection could be made because the target machine actively
  • 如何使用 SQL - INSERT...ON DUPLICATE KEY UPDATE?

    我有一个脚本可以捕获推文并将其放入数据库中 我将在 cronjob 上运行脚本 然后在我的网站上显示数据库中的推文 以防止达到 Twitter API 的限制 所以我不想在我的数据库中有重复的推文 我知道我可以使用 INSERT ON DU
  • 尝试在 Mac OSX 上的 virtualenv 和 MySQL 中安装 Django CMS 时出错

    当我尝试使用 virutalenv 安装带有 MySQL 的 django CMS 时 出现以下错误 RuntimeError maximum recursion depth exceeded Users ethan Sites env b
  • MySQL创建表中的日期格式

    我必须使用 MySql 创建一个表 它可以按以下格式存储日期 我尝试过如下 CREATE TABLE birth date DATE 但它不起作用 因为日期格式是 YYYY MM DD 我该怎么办 谢谢 MySQL 或几乎任何其他数据库 中
  • Navicat 中的 MySQL 视图 - 如何定义“主键”?

    当我在 Navicat 中定义视图时 经常会收到以下消息 xxx 没有主键 对此表的更新将使用以下伪语句完成 UPDATE xxx SET ModifiedFieldsAndValues WHERE AllFieldsAndOldValue
  • 如何使用默认约束为mysql中的列创建随机数?

    DEFAULT 约束在接受字符串或当前日期值方面没有问题 我需要的是一个约束 每次创建实体时都会创建一个随机的 4 位数字 我尝试了以下代码 但它返回语法错误 ALTER TABLE client number ADD 代码 INT 4 D
  • phpMyAdmin - #1932 重新安装后表不存在(正在使用排序规则)

    我正在做我的论文 当我发现我的 XAMPP 服务器有一些错误日志时 所以我决定将我的 XAMPP 重新安装到更新的版本 我从 SO 中的一些线程中得 到了这个想法 我移动了我的mysql gt data文件夹并在我的新安装文件夹中再次恢复它
  • 自动递增和最后插入 ID

    我在用着AUTO INCREMENT我想获取插入行的 ID 以便我可以使用更新另一个表ID作为两个表之间的公共字段 我明白LAST INSERT ID会排在最后ID 然而 我担心的是 数据库被许多用户同时访问 因此 可能有另一个进程访问该表

随机推荐