如何使用 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 分别对列进行计数和分组? 的相关文章

  • Mysql 创建定义器

    我创建了一个在 CentOS Web 服务器上运行的 Intranet Web 应用程序 该应用程序使用另一个本地服务器 始终是 CentOS 作为 MySQL 数据库 在数据库内部我创建了例程 这些例程总是这样开始 CREATE DEFI
  • 免费 PHP 登录库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PDO PHP 连接,致命错误

    我的连接类 firstcode php class DB functions public db function construct try db new PDO mysql localhost dbname xxx charset ut
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • POINT 列上的 MySQL INSERT/UPDATE

    我正在尝试用我国家的地理位置填充我的数据库 我的一张表有 4 个字段 ID PK 纬度 经度和地理点 EDIT SCDBs Punto Geografico SET lat 18 469692 SET lon 63 93212 SET g
  • 从另一台计算机访问 MYSQL

    我想开发一个java桌面应用程序 我想在其中设置服务器 这意味着我在这里使用mysql db 该数据库将仅存储在一台电脑上 其余所有用户都可以访问该数据库 所以 我听说了mysql远程连接 其中尝试了一些事情 这些措施如下 我的电脑已连接w
  • 如何在 MySQL 中求和时间?

    正如您在图片中看到的 我有一份停机报告 显示了所选工厂在选定日期的停机时间 现在我想添加所有的值 Time Duration 列并将其显示在附近的单独显示中 TOTAL TIME DURATION 例如 在图像中 所选日期为 2015 年
  • covertJSONtoSQL 在 NiFi 中返回空值

    我正在设计一项工作 使用以下命令将数据从 MySQL 中的数据库转移到另一个数据库 MySQL 执行SQL处理器随后将Avro转换为Json then 将Json转换为SQL then PutSQL如下流程图所示 将JSON转换为SQL返回
  • MySQL 通过 current_timestamp 选择上个月的数据

    直到今天 当我使用 MySQL 并需要对日期 时间执行操作时 我使用带有 unix 时间戳的 int 列 没有出现任何问题 但今天在阅读了一些指南后 我决定默认使用 current timestamp 测试时间戳列 所以我感兴趣如何按列选择
  • MySQL“LIKE”搜索不起作用

    我通过 LOAD DATA INFILE 在 MySQL 中导入了一个 txt 数据库 一切似乎都正常 唯一的问题是 如果我使用以下查询在数据库上搜索记录 SELECT FROM hobby WHERE name LIKE Beading
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • Postgresql 一张表的多个计数

    我想从表中的两列中获得这些列中值的统一计数 例如 两列是 表 报告 type place one home two school three work four cafe five friends six mall one work one
  • Python Pandas 滚动聚合一列列表

    我有一个简单的数据框 df 和一列列表lists 我想根据以下内容生成一个附加列lists The df好像 import pandas as pd lists 1 1 2 1 2 3 3 2 9 7 9 4 2 7 3 5 create
  • 使用Perl/DBI/MySQL/InnoDB查找外键信息

    我想以编程方式查找 MySQL 数据库中特定 InnoDB 表的外键 我正在使用 Perl 我偶然发现 dbh gt foreign key info 我刚刚尝试使用它 但似乎有点错误 它不会返回 ON DELETE 和 ON UPDATE
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • MySQL 错误 1172 - 结果包含多行

    在存储过程中运行查询时 我从 MySQL 收到此错误 错误代码 1172 结果包含多行 我理解错误 我正在做一个SELECT INTO var list 因此查询需要返回单行 当我使用LIMIT 1 or SELECT DISTINCT 错
  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l

随机推荐