2016-09-23 56 views
0

獲得組的前x個記錄我有一個商店的產品表。這些產品具有valid_from和valid_to日期。在我的查詢中,我想只有當前有效的每個商店的第一個x記錄,按上一次插入desc排序。Mysql:通過

我目前使用下面的查詢:

SELECT * FROM 
    (
     SELECT 
      s.id as shopid, ss.name as shopname, p.name as productname, p.validfrom, p.validto 
     FROM 
      product p 
     JOIN 
      shop s ON p.shopid = s.id 
     WHERE 
      s.status = 'Active' AND 
      (now() BETWEEN p.validfrom and p.validto) 
     ORDER BY p.insert DESC 
    ) as a 

GROUP BY 
    shopid 
ORDER BY 
    shopname asc 

這顯然只是給了我各店的最新記錄,但我希望能有最新的2分或3的記錄。我怎樣才能做到這一點?

獎勵問題:我想每個商店有所不同。所以對於商店A,我只想要第一條記錄,而商店B是第一條記錄。您可能會認爲每個擁有此號碼的商店都有一些數據庫字段,例如s.num_of_records。

類似的問題(可能重複)讓我在正確的方向,但它不能完全解決我的問題(見最新評論)

+0

[在GROUP BY中使用LIMIT獲得每個組的N個結果?](http://stackoverflow.com/questions/2129693/using-limit-within-group-by-to-get-n-results -per-group) – e4c5

+0

不完全一樣,但類似的問題讓我朝着正確的方向,謝謝。我現在使用: 'code' @currcount:= IF(@currvalue = s.id,@currcount + 1,1)等級 @currvalue:= s.id AS lastshopid 'code' 要使爲同一家商店排名,但這並不總是以某種方式工作。一些商店有正確的排名,其他排名都是1。任何線索可能是錯誤的?我正在通過shopid訂購。 – MNL

+0

你的MySQL版本是什麼? –

回答

0

它通過給每個記錄基於前shopid一個等級。如果shopid是相同的,我將它評爲+1。否則我排名1.

然而,仍然有一個問題。儘管我使用shopid進行訂單,但並不是所有商店的排名都正確。我在查詢中添加了lastshopid以檢查結果,儘管記錄是由商店在結果中排​​序的,但lastshopid有時會有另一個id。我認爲這一定是因爲排序是在最後而不是開始。

任何人有一個想法如何解決這個問題?我需要以正確的順序購買這個排名解決方案。

0

您可以使用附加的LEFT JOIN和product表來統計稍後插入的同一商店的產品數量。該號碼可以與您的num_of_records列進行比較。

SELECT s.id as shopid, s.name as shopname, 
     p.name as productname, p.validfrom, p.validto 

FROM shop s 

JOIN product p 
    ON p.shopid = s.id 

LEFT JOIN product p1 
    ON p1.shop_id = p.shop_id 
    AND p1.validfrom <= NOW() 
    AND p1.validto >= NOW() 
    AND p1.`insert` > p.`insert` 

WHERE s.status = 'Active' 
    AND p.validfrom <= NOW() 
    AND p.validto >= NOW() 

GROUP BY p.id 

HAVING COUNT(p1.id) + 1 <= s.num_of_records 

ORDER BY shopname asc 

指數可能會有幫助:shop(status, name)product(shop_id, validfrom)product(shop_id, validto)(可能是第二個)。注1:如果您在同一商店同一時間(同一秒)插入了兩件商品,並且兩件商品均爲該商店限量列表中的最後一件商品,則它們都將被選中。如果使用insert列中的AUTO_INCREMENT列,則不會發生這種情況。

注2:根據組大小(每個商店的產品數量),此查詢可能會很慢。

+0

這工作很好,非常感謝!性能並不是一個大問題,因爲我在一段時間內緩存了結果。 – MNL