>  기사  >  백엔드 개발  >  mysql 分组按name分组取值最大一条,不理解啊,求解惑。

mysql 分组按name分组取值最大一条,不理解啊,求解惑。

WBOY
WBOY원래의
2016-06-27 13:18:07992검색

select a.* from test a where 1 > (select count(*) from test where name = a.name and val > a.val )
sql语句,按name分组显示最大的val值的字段
问题:select count(*) from test where name = a.name and val > a.val  子查询查出来不是一个数值吗?那sql语句不就成了
select a.* from test a where 1 >1?  但是这个逻辑明显是错误的,那正确的逻辑是什么呢? 外层和内层是如何比较的呢?感觉智商不够理解不了啊,,,,,


回复讨论(解决方案)

当取得val最大值时,count(*) 是0 ,1>0 不是刚好满足吗

当 a.val 为最大值时
val > a.val 不成立,(select count(*) from test where name = a.name and val > a.val ) 返回 0 (没有符合条件的记录)
1 > (select count(*) from test where name = a.name and val > a.val )
成立,该条记录被选出

其实你已经知道了,只是没绕过弯子来
select a.* from test a where 1 > count
count 是所有大于 a.val 的记录数,只在不存在的时候才会有 conut 等于 0.表达式 1 > 0 成立

当 a.val 为最大值时
val > a.val 不成立,(select count(*) from test where name = a.name and val > a.val ) 返回 0 (没有符合条件的记录)
1 > (select count(*) from test where name = a.name and val > a.val )
成立,该条记录被选出

其实你已经知道了,只是没绕过弯子来
select a.* from test a where 1 > count
count 是所有大于 a.val 的记录数,只在不存在的时候才会有 conut 等于 0.表达式 1 > 0 成立


感谢两位版主解答! 
有些明白了,但是还有点不解,当 select a.* from test a where 2 > 0 就取了2条 我想知道这数据是怎么得出来的呢,是跟自身进行比较得出的吗? 因为我直接写select a.* from test a where 1>0这个条件是可以把所有数据都取出来的。

意思就是遍历test 表中每一条记录,然后与自身做比较,每遍历一条记录,都与自身所有记录都比较一次。

相当于php中的两次foreach 
foreach($ar as $v)
    foreach($ar as $vl)

意思就是遍历test 表中每一条记录,然后与自身做比较,每遍历一条记录,都与自身所有记录都比较一次。

相当于php中的两次foreach 
foreach($ar as $v)
    foreach($ar as $vl)


我就是这么想的,就是有点不确定,哈哈,谢谢两位版主。
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.