繁体   English   中英

SQL查询-选择前5行并仅在存在用户的情况下进一步选择行

[英]Sql query - selecting top 5 rows and further selecting rows only if User is present

我有点固执于如何实现此查询-这与我之前发布的查询非常相似,但我无法破解它。

我有一个购物桌,每当用户购买任何东西时,都会插入一条记录。

一些领域是

* shopping_id (primary key)
* store_id
* user_id

现在,我只需要拉出他在前5名访客中的那些商店的列表即可:

当我分解它时,这就是我想要完成的工作:

* Find all stores where this UserA has visited
* For each of these stores - see who the top 5 visitors are.
* Select the store only if UserA is among the top 5 visitors.

相应的查询将是:

select store_id from shopping where user_id = xxx
select user_id,count(*) as 'visits' from shopping 
where store_id in (select store_id from shopping where user_id = xxx)
group by user_id
order by visits desc
limit 5

现在,我需要在此结果集中检查UserA是否存在,并仅在他存在时选择该存储。 例如,如果他去过一家商店5次-但是如果有5个或更多的人去过该商店5次以上,则不应选择该商店。

所以我有点迷路了。

谢谢你的帮助

这应该做。 它使用中间的VIEW来计算每个用户在每个商店购物的次数。 另外,假设您在某处有一个store表,其中每个store_id都列出一次。 如果不是这样,您可以将SELECT store_id FROM stores更改为SELECT DISTINCT store_id FROM shopping以达到相同的效果,但效果较慢。

 CREATE VIEW shop_results (store_id, user_id, purchase_count) AS
     SELECT store_id, user_id, COUNT(*)
     FROM shopping GROUP BY store_id, user_id

 SELECT store_id FROM stores 
    WHERE 'UserA' IN 
      (SELECT user_id FROM shop_results 
       WHERE shop_results.store_id = stores.store_id 
       ORDER BY purchase_count DESC LIMIT 5)

您可以通过将SELECT的SELECT放在子查询中,将它们组合成一个查询,但是我认为这种方式更容易阅读,而且很可能确实希望在系统中的其他地方聚集这些信息。在视图中只定义一次,而不是在多个查询中重复一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM