Mysql SQL:为什么下面的两个查询不能得到相同的输出?
我正在努力寻找那些可能取得不同成绩的学生。如果你获得18分,你就通过了课程,最高分数是30分。因此,如果你获得了13个不同的分数,高于17分,那么你就获得了所有可能的及格分数。第一个查询返回0行,第二个查询返回一行,其中一个学生已收到所有可能的及格分数Mysql SQL:为什么下面的两个查询不能得到相同的输出?,mysql,sql,output,Mysql,Sql,Output,我正在努力寻找那些可能取得不同成绩的学生。如果你获得18分,你就通过了课程,最高分数是30分。因此,如果你获得了13个不同的分数,高于17分,那么你就获得了所有可能的及格分数。第一个查询返回0行,第二个查询返回一行,其中一个学生已收到所有可能的及格分数 select sid, name, count(grade) from student natural join exam group by sid, name having count(distinct grade > 17) = 13
select sid, name, count(grade)
from student natural join exam
group by sid, name
having count(distinct grade > 17) = 13;
select sid, Name
from exam natural join student
group by sid
having count(distinct grade) = ( select count(distinct grade)
from exam );
提前谢谢你 您不应该使用
自然连接
。这使得这个问题对于它正在做什么非常不清楚
在任何情况下,此代码:
count(distinct grade > 17)
只能返回0
,或1
,或2
。为什么?因为它正在计算布尔表达式的不同值。布尔表达式只有两个值(加上NULL
)
因此,它永远不会等于13
,其中:
count(distinct grade > 17)
实际上,您正在计算布尔表达式grade>17
的不同值的数量,即1
或2
,因为布尔表达式可能只有两个不同的值:0
表示false
和1
表示true
当grade>17
时,您应该计算grade
的不同值,这可以通过以下方法完成:
count(distinct case when grade > 17 then grade end)
你可以用这个例子来试验为什么它不起作用