我有点坚持如何实现这个查询 - 这与我之前发布的查询非常相似,但我无法破解它。
我有一个购物桌,每当用户购买任何东西时,都会插入一条记录。
部分字段是
* 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次 - 则不应选择该商店。
所以我有点迷失在这里。
感谢您的帮助
答案 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放在子查询中来将这些组合成单个查询,但我认为这样更容易阅读,您可能希望系统中其他地方的聚合信息 - 更一致的是在视图中定义一次,而不是在多个查询中重复它。