在MySQL我们经常会用到count,max,min这些函数,但是在使用这些函数的时候你确定你写的sql一定正确吗?话不多说,我们来个需求。
假设现在有一张消费表如下:
现在我们需要取出每个用户购买最多的商品名。看似一个很简单的需求,基本上都能在脑海里想出来下面的SQL。
SELECT max(num),user_id,goods_name FROM tb_user_consume GROUP BY user_id LIMIT 10;
从语句上面看,好像没有什么问题都满足需求,我们执行下来验证下。返回的结果如下:
感觉有点不对劲,难道1号商品这么畅销吗?大家都是买1号商品,我们来看下原始数据。
我们很清楚的看出来了,1000001 购买的商品是2号商品居多,结合上面的查询结果来看,max(num)似乎没有问题,那么出问题似乎的是在goods_name的显示上。查下网上的教程查询的结果集都只会包含group的那一列,和max的结果值。那么我们还得自己来想解决办法,做一个子查询先按照user_id分组取出最大的num值,创建临时表和源表用user_id和num查询,于是就有了下面的SQL。
SELECT a.user_id,a.`goods_name`,a.num FROM tb_user_consume a JOIN (SELECT user_id , max(num) AS num FROM tb_user_consume where user_id < 1000010 GROUP BY user_id) b ON a.user_id = b.user_id AND a.num = b.num;
查询结果为
对比数据发现查询结果准确无误。所以千万不能偷懒使用简单的使用max查询其他列。