我需要从表格中返回每个类别中最好的5个分数。到目前为止,我已经尝试过以下网站上的示例:selecting top n records per group
查询:
prev_date=`TZ=bb24 date +%Y%m%d`
echo $prev_date
我得到了前n个,因为我需要b 我的问题是它随机返回的重复项,我不知道它们来自哪里
正如你所看到的,英语和数学有重复,不应该存在
select
subject_name,substring_index(substring_index
(group_concat(exams_scores.admission_no order by exams_scores.score desc),',',value),',',-1) as names,
substring_index(substring_index(group_concat(score order by score desc),',',value),',',-1)
as orderedscore
from exams_scores,students,subjects,tinyint_asc
where tinyint_asc.value >=1 and tinyint_asc.value <=5 and exam_id=2
and exams_scores.admission_no=students.admission_no and students.form_id=1 and
exams_scores.subject_code=subjects.subject_code group by exams_scores.subject_code,value;
我检查了表,没有重复项
确认表中没有重复项:
+------------------+-------+--------------+
| subject_name | names | orderedscore |
+------------------+-------+--------------+
| English | 1500 | 100 |
| English | 1500 | 100 |
| English | 2491 | 100 |
| English | 1501 | 99 |
| English | 1111 | 99 |
|Mathematics | 1004 | 100 |
| Mathematics | 1004 | 100 |
| Mathematics | 2722 | 99 |
| Mathematics | 2734 | 99 |
| Mathematics | 2712 | 99 |
+-----------------------------------------+
结果:
select * from exams_scores
having(exam_id=2) and (subject_code=121) and (admission_no=1004);
英语的结果相同。
如果我运行5次查询,我有时会得到另一个具有重复值的字段。
任何人都可以告诉我为什么我的查询表现得这样......我试着在内部添加明显的
+------+--------------+---------+--------------+-------+
| id | admission_no | exam_id | subject_code | score |
+------+--------------+---------+--------------+-------+
| 4919 | 1004 | 2 | 121 | 100 |
+------+--------------+---------+--------------+-------+
1 row in set (0.00 sec)
但那不起作用?
答案 0 :(得分:1)
您按exams_scores.subject_code, value
进行分组。如果将它们添加到选定的列(...as orderedscore, exams_scores.subject_code, value from...
),您应该会看到所有行与您分组的这两列不同。哪个是GROUP BY
的正确语义。
编辑,澄清:
WHERE
子句删除一些行。GROUP BY
子句对剩余的行进行分组。GROUP_CONCAT
并返回其累计值。如果选择GROUP BY
子句中未包含的列,则这些列的返回结果是任意的,因为SQL Server会将与GROUP BY
子句中指定的列相等的所有行减少为一行 - 对于其余列,结果几乎未定义(因此&#34;随机性&#34;您正在经历),因为 - 服务器应该选择什么作为此列的值?它只能从所有减少的行中随机选择一个。
事实上,一些SQL服务器不会执行这样的查询并返回SQL错误,因为这些列的结果将是未定义的,这是您一般不想要的。使用这些服务器(我相信MSSQL就是其中之一),您或多或少只能在SELECT
子句中包含GROUP BY
子句中的列。
编辑2:最后,这意味着您必须优化GROUP BY
子句以获得所需的分组。