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 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


