Sql Query – 限制查询结果
我很确定我们不能将LIMIT子句用于我想做的工作 – 以是我想找到是否有其他要领可以实现这一点. 我有一个表,用于捕捉哪个用户会见了哪个市肆.每次用户会见市肆时,城市在此表中插入一行. 有些规模是 > shopping_id(主键) 此刻我想要的是 – 对付一组给定的市肆,找到最多会见市肆的前5位用户. 我可以一次做1个市肆: select store_id,user_id,count(1) as visits from shopping where store_id = 60 group by user_id,store_id order by visits desc Limit 5 这将给我5个用户会见store_id = 60的最大次数 我想要做的是提供10个store_ids的列表,并为每个市肆提取已会见该市肆最多倍的5个用户 select store_id,count(1) as visits from shopping where store_id in (60,61,62,63,64,65,66) group by user_id,store_id order by visits desc Limit 5 这不起浸染,由于最后的限定将为每个市肆仅返回5行而不是5行. 关于怎样实现这一方针的任何设法.我老是可以写一个轮回并一次转达1个市肆,但想知道是否有更好的要领 办理要领行使两个用户变量并计较沟通的持续store_id,您可以用您想要的任何限定替代< = 5SELECT a.* FROM ( SELECT store_id,count(1) as visits FROM shopping WHERE store_id IN (60,66) GROUP BY store_id,user_id ORDER BY store_id,visits desc,user_id ) a,(SELECT @prev:=-1,@count:=1) b WHERE CASE WHEN @prev<>a.store_id THEN CASE WHEN @prev:=a.store_id THEN @count:=1 END ELSE @count:=@count+1 END <= 5 按照要求编辑一些表明: 第一个子查询(a)是对数据举办分组和排序的子查询,因此您将得到如下数据: store_id | user_id | visits ---------+---------+------- 60 1 5 60 2 3 60 3 1 61 2 4 61 3 2 第二个子查询(b)用-1和@count初始化用户变量@prev 然后我们从子查询中选择全部数据(a)验证案例中的前提. >验证我们看到的先前store_id(@prev)与当前store_id差异. step | @prev | @count | store_id | user_id | visits -----+-------+--------+----------+---------+------- 0 -1 1 1 60 1 60 1 5 2 60 2 60 2 3 3 60 3 60 3 1 4 61 1 61 2 4 5 61 2 61 3 2 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |