簡體   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