我有一张这样的表
+-------+-------+-------+-------+
| 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进行比较
答案 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
的最高成绩。
修改强>
您也可以使用相关的子查询:
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
<强> 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
答案 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+ |
+---+------+