很久没有写SQL了,复习一下,遇到了一个问题,用group by 每组只显示一行
我这儿有三张表
user,里面有ID,name
produce,里面有ID,name
order,里面有ID,userid(外键,是userID),proid(外键,是produceID)
千万不要把表名建成order,谁用谁知道~~~
我想用内联接查出 用户名,订单号,商品名。
那么SQL自然是:
select O.id ,U.id, U.name,P.name from user AS U
inner join orders as O on O.userid=U.Id
inner join produce as P on P.Id=O.proid ;
结果吗~~
四个列分别是
订单ID,用户ID, 用户名,商品名(字段名我起的太乱了。。。。凑合看看吧~~~)
我想让三个小刘的结果都放在一起。我不知道为什么就想到了group by,以用户ID分组,没毛病~~
然后....加上group by U.id,鬼鬼,瞬间爆炸!!!
就只有两行了,但是我不慌,反手就是一个order by U.id(下表第二列)。
太久没有写sql,把group by的功能错当order by。 FUCK THAT
那么group好像就只能配合聚合函数(MIN,MAX,AVG,COUNT等)用来统计一个组的字段信息什么的了,比如这样
select U.id ,count(U.id) from user AS U
inner join orders as O on O.userid=U.Id
inner join produce as P on P.Id=O.proid
group by U.id ;
结果就为
似乎也许大概就只能统计了?不能完整的显示一个组吗?只能交给where xx=xx了吗。。。。
我的脑子里突然出现了having这个玩意。会不有那种骚操作,用group by xxx 加上having 就可以选出一个组,然后把所有组的信息打出来,嘤嘤嘤,试试就试试。
然后我想了想,试了试,不给力啊!行不通,不过呢,能用
group by xxx加上having 选出很多符合要求的组。
比如选出订单数>0的用户+用户名。
select U.id ,U.name from user AS U
inner join orders as O on O.userid=U.Id
inner join produce as P on P.Id=O.proid
group by U.id having count(U.id)>0;
结果就为: