Sql查询 - 选择前5行并仅在User存在时进一步选择行

时间:2010-03-23 16:52:52

标签: sql mysql

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

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

部分字段是

* shopping_id (primary key)
* store_id
* user_id

现在我需要的是只提取他跻身前五名访客的商店列表:

当我将其分解时 - 这就是我想要实现的目标:

* 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次 - 则不应选择该商店。

所以我有点迷失在这里。

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

这应该这样做。它使用中间VIEW来计算每个用户在每个商店购物的次数。此外,它假设您在某个地方有一个商店表,每个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)

您可以通过将来自VIEW的SELECT放在子查询中来将这些组合成单个查询,但我认为这样更容易阅读,您可能希望系统中其他地方的聚合信息 - 更一致的是在视图中定义一次,而不是在多个查询中重复它。