草庐IT

mysql - 检索表中出现次数最多的值

coder 2023-10-24 原文

我遇到了一个非常复杂的问题。让我先解释一下我现在在做什么:

我有一个名为 feedback 的表,我在其中存储了针对类(class) ID 的成绩。该表如下所示:

+-------+-------+-------+-------+-----------+--------------
| id    | cid   | grade |g_point| workload  | easiness
+-------+-------+-------+-------+-----------+--------------
| 1     |  10   |  A+   |   1   |      5    |   4
| 2     |  10   |  A+   |   1   |      2    |   4
| 3     |  10   |  B    |   3   |      3    |   3
| 4     |  11   |  B+   |   2   |      2    |   3
| 5     |  11   |  A+   |   1   |      5    |   4
| 6     |  12   |  B    |   3   |      3    |   3
| 7     |  11   |  B+   |   2   |      7    |   8
| 8     |  11   |  A+   |   1   |      1    |   2

g_point 只有特定的成绩值,因此我可以使用这些值来显示按成绩排序的用户类(class)。

好的,现在我的首要任务是打印出每门类(class)的成绩成绩 可以根据每门类(class)的最大出现次数来计算。例如,从这个表中我们可以看到 cid = 10 的结果将是 A+,因为它在那里出现了两次。这很简单。我已经实现了这个查询,我将在最后写在这里。

主要问题是当我们谈论有两个不同等级的类(class)cid = 11 时。现在,在那种情况下,客户要求我对这两个类(class)的工作量和难易程度取平均值,应该显示平均水平较高的类(class)。平均值将像这样计算:

  all workload values of the grade against course
+ all easiness values of the grade against course
/ 2 

从这个例子中 cid = 11 有四个条目,对一门类(class)有相同的成绩

B+ 平均成绩

avgworkload(2 + 7)/2=x 
avgeasiness(3 + 8)/2 = y

答案 x+y/2 = 10

A+ 平均成绩

 avgworkload(5 + 1)/2=x 
avgeasiness(4 + 2)/2 = y

  answer x+y/2 = 3

所以成绩应该是B+

这是我为获得最大出现等级而运行的查询

SELECT
    f3.coursecodeID cid,
    f3.grade_point p,
    f3.grade g
FROM (
    SELECT
        coursecodeID,
        MAX(mode_qty) mode_qty
    FROM (
        SELECT
            coursecodeID,
            COUNT(grade_point) mode_qty
        FROM feedback
        GROUP BY
            coursecodeID, grade_point
    ) f1
    GROUP BY coursecodeID
) f2
INNER JOIN (
    SELECT
        coursecodeID,
        grade_point,
        grade,
        COUNT(grade_point) mode_qty
    FROM feedback
    GROUP BY
        coursecodeID, grade_point
) f3
ON
    f2.coursecodeID = f3.coursecodeID AND
    f2.mode_qty = f3.mode_qty
GROUP BY f3.coursecodeID
ORDER BY f3.grade_point

最佳答案

这里是 SQL Fiddle . 我添加了一个包含所有类(class) ID 列表的 Courses 表,以使查询的主要思想更容易看到。您很可能在真实数据库中拥有它。如果没有,您可以通过按 cid 分组,根据 feedback 即时生成它。

对于每个 cid,我们需要找到 grade。按cid, gradefeedback 进行分组,以获取cid 的所有成绩列表。我们只需要为 cid 选择一个等级,因此我们使用 LIMIT 1。为了确定选择哪个等级,我们订购了它们。首先,按出现次数 - 简单的 COUNT。第二,按平均分。最后,如果有多个等级具有相同的出现和相同的平均分数,则选择具有最小 g_point 的等级。您可以通过调整 ORDER BY 子句来调整规则。

SELECT
  courses.cid
  ,(
    SELECT feedback.grade
    FROM feedback
    WHERE feedback.cid = courses.cid
    GROUP BY
      cid
      ,grade    
    ORDER BY 
      COUNT(*) DESC
      ,(AVG(workload) + AVG(easiness))/2 DESC
      ,g_point
    LIMIT 1
  ) AS CourseGrade
FROM courses
ORDER BY courses.cid

结果集

cid CourseGrade
10  A+
11  B+
12  B

更新

MySQL 没有横向连接,因此获取第二列 g_point 的一种可能方法是重复相关子查询。 SQL Fiddle

SELECT
  courses.cid
  ,(
    SELECT feedback.grade
    FROM feedback
    WHERE feedback.cid = courses.cid
    GROUP BY
      cid
      ,grade    
    ORDER BY 
      COUNT(*) DESC
      ,(AVG(workload) + AVG(easiness))/2 DESC
      ,g_point
    LIMIT 1
  ) AS CourseGrade
  ,(
    SELECT feedback.g_point
    FROM feedback
    WHERE feedback.cid = courses.cid
    GROUP BY
      cid
      ,grade    
    ORDER BY 
      COUNT(*) DESC
      ,(AVG(workload) + AVG(easiness))/2 DESC
      ,g_point
    LIMIT 1
  ) AS CourseGPoint
FROM courses
ORDER BY CourseGPoint

结果集

cid CourseGrade CourseGPoint
10  A+          1
11  B+          2
12  B           3

更新 2 将平均分数添加到 ORDER BY SQL Fiddle

SELECT
  courses.cid
  ,(
    SELECT feedback.grade
    FROM feedback
    WHERE feedback.cid = courses.cid
    GROUP BY
      cid
      ,grade    
    ORDER BY 
      COUNT(*) DESC
      ,(AVG(workload) + AVG(easiness))/2 DESC
      ,g_point
    LIMIT 1
  ) AS CourseGrade
  ,(
    SELECT feedback.g_point
    FROM feedback
    WHERE feedback.cid = courses.cid
    GROUP BY
      cid
      ,grade    
    ORDER BY 
      COUNT(*) DESC
      ,(AVG(workload) + AVG(easiness))/2 DESC
      ,g_point
    LIMIT 1
  ) AS CourseGPoint
  ,(
    SELECT (AVG(workload) + AVG(easiness))/2
    FROM feedback
    WHERE feedback.cid = courses.cid
    GROUP BY
      cid
      ,grade    
    ORDER BY 
      COUNT(*) DESC
      ,(AVG(workload) + AVG(easiness))/2 DESC
      ,g_point
    LIMIT 1
  ) AS AvgScore
FROM courses
ORDER BY CourseGPoint, AvgScore DESC

结果

cid CourseGrade CourseGPoint    AvgScore
10  A+          1               3.75
11  B+          2               5
12  B           3               3

关于mysql - 检索表中出现次数最多的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31351092/

有关mysql - 检索表中出现次数最多的值的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  3. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  4. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  5. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  6. ruby - 获取数组中的值并最小化某个类属性的最优雅的方法是什么? - 2

    假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)

  7. ruby-on-rails - 使用作为方法的值在 ruby​​ 中搜索哈希 - 2

    我在搜索我的值是方法的散列时遇到问题。我只是不想运行plan_type与键匹配的方法。defmethod(plan_type,plan,user){foo:plan_is_foo(plan,user),bar:plan_is_bar(plan,user),waa:plan_is_waa(plan,user),har:plan_is_har(user)}[plan_type]end目前如果我传入“bar”作为plan_type,所有方法都会运行,我怎么能只运行plan_is_bar方法呢? 最佳答案 这个变体怎么样?defmethod

  8. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  9. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

  10. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

随机推荐