mysql - 表中给定值的最大出现次数

时间:2015-07-10 06:58:45

标签: php mysql sql

我有一张这样的表

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

g_point是与每个成绩相关联的值。例如A +等级考虑最高,所以我指定A +的值是1(最高从1到10开始),依此类推。这些g_point值是常量。现在我想要做的是我希望显示每个课程的最高成绩,如果不知何故只有两个不同成绩的作品,我想将它与 g_point 进行比较并选择其值较低因为较低的整数值意味着较高的等级结果应该是这样的,并且从最高级到低级排序。

+-------+-------+
| cid   | grade |
+-------+-------+
| 10    |   A+  |
| 11    |   A+  |
| 12    |   B   |

我试过这个查询

SELECT coursecodeID AS cid, (SELECT grade 
                             FROM feedback 
                             WHERE coursecodeID = cid 
                             GROUP BY grade 
                             ORDER BY COUNT(*) DESC LIMIT 0,1) AS g 
FROM feedback 
GROUP BY coursecodeID

但是在这个查询中我不知道如何将它与g_point值进行比较,并且课程没有按顺序显示(从最高等级到最低等级)。

注意:我想选择每个课程ID具有最大出现次数的成绩。例如,在这个表格课程中,id 10有2 A +等级,所以我们会考虑A +,如果碰撞发生一个是A +而另一个是B +,那么我们必须将它与g_point进行比较

3 个答案:

答案 0 :(得分:0)

您可以使用以下查询:

SELECT DISTINCT m1.cid, m1.grade
FROM mytable AS m1
INNER JOIN (
   SELECT cid, MIN(g_point) AS maxGrade
   FROM mytable
   GROUP BY cid ) m2
ON m1.cid = m2.cid AND m1.g_point = m2.maxGrade   

派生表包含每g_point的最小cid。如果您将其加入原始表格,那么您可以获得每cid的最高成绩。

strconv.Atoi()

修改

您也可以使用相关的子查询:

SELECT cid, (SELECT grade
             FROM mytable AS m2
             WHERE m2.cid = m1.cid 
             ORDER BY g_point LIMIT 1) AS maxGrade     
FROM mytable AS m1
GROUP BY cid

Demo here

<强> EDIT2:

您希望获得每cid最大出现次数的成绩。如果有多个成绩共享此最大数字,则获取具有最低g_point的成绩。

您可以使用变量:

SELECT cid, grade 
FROM (
  SELECT cid, grade,
         @row_number := IF (@cid <> cid,
                           IF (@cid := cid, 1, 1),
                           IF (@cid := cid, @row_number+1, @row_number+1)) AS rn
  FROM (                         
    SELECT cid, grade, 
           COUNT(*) AS cnt, 
           (SELECT g_point 
            FROM mytable AS m2
            WHERE m1.grade = m2.grade 
            LIMIT 1) AS g_point
    FROM mytable AS m1
    GROUP BY cid, grade 
  ) t
  CROSS JOIN (SELECT @row_number:=-1, @cid:=-1) AS vars
  ORDER BY cid, cnt DESC, g_point
) s
WHERE rn = 1

Demo here

答案 1 :(得分:0)

这有效,但需要&#39; g_point&#39;否则将被退回。

SELECT cid,grade,MIN(g_point)
FROM grades
GROUP BY cid

这更可靠,因为它在子查询中生成成绩,然后将其附加到主表。

SELECT cid, (
    SELECT grade
    FROM grades g2
    WHERE g2.cid = g1.cid 
    ORDER BY g_point
    LIMIT 1
) AS grade     
FROM grades g1
GROUP BY cid

答案 2 :(得分:0)

要考虑的事情......

SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT i 
     , CONCAT(CHAR((i/2)+64),IF(MOD(i,2)=1,'+',''))n 
  FROM ints 
 WHERE i > 0;
+---+------+
| i | n    |
+---+------+
| 1 | A+   |
| 2 | A    |
| 3 | B+   |
| 4 | B    |
| 5 | C+   |
| 6 | C    |
| 7 | D+   |
| 8 | D    |
| 9 | E+   |
+---+------+