mysql随机重复值返回错误的结果

时间:2015-07-20 13:47:32

标签: mysql

我需要从表格中返回每个类别中最好的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)

但那不起作用?

1 个答案:

答案 0 :(得分:1)

您按exams_scores.subject_code, value进行分组。如果将它们添加到选定的列(...as orderedscore, exams_scores.subject_code, value from...),您应该会看到所有行与您分组的这两列不同。哪个是GROUP BY的正确语义。

编辑,澄清:

  1. 首先,SQL Server根据您的WHERE子句删除一些行。
  2. 之后,它会根据您的GROUP BY子句对剩余的行进行分组。
  3. 最后,它会选择您指定的列,方法是直接返回列值或在某些列上执行GROUP_CONCAT并返回其累计值。
  4. 如果选择GROUP BY子句中未包含的列,则这些列的返回结果是任意的,因为SQL Server会将与GROUP BY子句中指定的列相等的所有行减少为一行 - 对于其余列,结果几乎未定义(因此&#34;随机性&#34;您正在经历),因为 - 服务器应该选择什么作为此列的值?它只能从所有减少的行中随机选择一个。

    事实上,一些SQL服务器不会执行这样的查询并返回SQL错误,因为这些列的结果将是未定义的,这是您一般不想要的。使用这些服务器(我相信MSSQL就是其中之一),您或多或少只能在SELECT子句中包含GROUP BY子句中的列。

    编辑2:最后,这意味着您必须优化GROUP BY子句以获得所需的分组。