如何解决SQL查询-限制查询结果
使用两个用户变量并计算相同的连续store_id,您可以替换<= 5
为所需的任何限制
SELECT a.*
FROM (
SELECT store_id, user_id, count(1) as visits
FROM shopping
WHERE store_id IN (60,61,62,63,64,65,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)@prev
使用-1和 @count
1初始化用户变量
然后从子查询中选择所有数据(a)验证中的条件case
。
-
验证
@prev
我们之前看到的store_id()是否与当前store_id不同。由于第一个@prev
等于-1,因此没有与当前store_id匹配的条件,因此<>
我们输入的条件为true,那么第二种情况就是@prev
使用当前store_id更改值。这是特技这样我就可以改变两个用户变量@count
和@prev
在相同条件下。 -
如果先前的store_id等于
@prev
仅增加@count
变量。 -
我们检查计数是否在我们想要的值之内,因此
<= 5
因此,根据我们的测试数据,您可以:
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
解决方法
我非常确定我们不能将LIMIT子句用于我想做的事情-因此想确定是否还有其他方法可以实现此目的。
我有一个表,其中捕获了哪个用户访问了哪个商店。每次用户访问商店时,都会在此表中插入一行。
一些领域是
- shopping_id(primary key)
- store_id
- user_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_id的列表,并为每个商店获取访问该商店的最大时间的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个存储,但想知道是否有更好的方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。