当前位置: 首页 > 面试题库 >

SQL查询-限制查询结果

皇甫雨华
2023-03-14
问题内容

我非常确定我们不能将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,user_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个html" target="_blank">存储,但想知道是否有更好的方法


问题答案:

使用两个用户变量并计算相同的连续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和 @count1初始化用户变量

然后从子查询中选择所有数据(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


 类似资料:
  • 问题内容: 我想知道是否可以限制SQL请求的结果? 例如,最多只返回以下内容的50行: 谢谢。 问题答案: 是的,这是可能的。这在数据库引擎之间有所不同。 Postgres: SQL Server: …

  • 问题内容: 如何限制JPQL命名查询的选择查询?我需要在查询级别本身而不是在Java层中完成限制!!!我正在尝试使用 但徒劳!!! 请建议 问题答案: 没有提供限制查询的机制。这通常是通过使用上的方法来实现的。如果必须避免在Java代码中指定此内容,则可以在包含查询并执行限制的数据库中进行查看。然后像将表一样将实体映射到此视图。 例:

  • 问题内容: 我正在构建一个小界面,希望用户能够写出他们的 整个 sql语句,然后查看返回的数据。但是,我不希望用户能够做任何有趣的事情,即。实际上,我希望用户能够做的唯一一件事就是运行语句。我知道没有特定的SQLite用户,所以我在考虑要制定的一套规则来拒绝某些查询。也许是正则表达式字符串之类的东西(正则表达式使我有些害怕)。关于如何做到这一点的任何想法? 问题答案: 我可以为您的问题建议另一种方

  • 我对DynamoDB上的查询/扫描限制有疑问。 我的表有1000条记录,对所有记录的查询都返回50个值,但是如果我把设为5,这并不意味着查询将返回前5个值,它只是说对5个项目的查询表(以任何顺序,所以它们可能是非常旧的项目或新的项目),所以我有可能在查询中得到0个项目。如何实际获得查询的最新5项?我需要设置一个为5(数字是例子),因为查询/扫描更多的项目会很昂贵。 该查询具有此输入 我的表的索引是

  • 查询方法的结果可以通过关键字first或者top来限制,它们可以交替使用。在top/firest后添加数字来表示返回最大的结果数。如果没有数字,则默认假定1作为结果大小。 示例10。用Top和First查询限制结果大小 User findFirstByOrderByLastnameAsc(); User findTopByOrderByAgeDesc(); Page<

  • 主要内容:指定初始位置,不指定初始位置,LIMIT和OFFSET组合使用当数据表中有上万条数据时,一次性查询出表中的全部数据会降低数据返回的速度,同时给数据库服务器造成很大的压力。这时就可以用  LIMIT 关键字来限制查询结果返回的条数。 LIMIT 是 MySQL 中的一个特殊关键字,用于指定查询结果从哪条记录开始显示,一共显示多少条记录。 LIMIT 关键字有 3 种使用方式,即指定初始位置、不指定初始位置以及与 OFFSET 组合使用。 指定初始位置 LIMI