2012-10-29 49 views
1

我一直在試圖解決這個問題,週末,沒有運氣到目前爲止。我有兩個表:每組最大N填充

TopOffers:

OfferId RetailerId  Order 
1   38    0 
2   8    3 
3   17    2 
4   22    1 

而且Offers:

Id  RetailerId  Name   Description   etc... 
1  3    Strawberry  Red and smelly 
2  38    Cookie   Crunchy 
3  17    Onion   Of the nice kind 
4  22    Apple   Cheap 
5  8    Toothbrush  Lasts extra long! 

我的目標是讓高層10提供了每個零售商ID。它們應該列出的順序由TopOffer表中的Order字段指定(排序順序爲升序)。最重要的是,當零售商的TopOffer記錄少於10個時,結果應填充到10個優惠。 TopOffer表總是包含每個零售商10個或更少的記錄。

到目前爲止,我已經設法實現了這一點,這是有效的(我意識到它沒有得到前10名,而是TopOffer表中的所有內容,這是正常的,因爲TopOffer表總是等於或比前10對任何零售商)小:

SELECT b.* 
FROM 
(
    SELECT o.Id, to.`Order` FROM Offer AS o 
    LEFT JOIN TopOffer AS to 
    ON o.Id = to.OfferId 
) AS a, 
(
    SELECT o.*, to.`Order` FROM Offer AS o 
    LEFT JOIN TopOffer AS to 
    ON o.Id = to.OfferId 
) AS b 
WHERE a.`Order` >= b.`Order` AND a.Id = b.Id 
GROUP BY b.RetailerId, b.Id 
HAVING Count(1) BETWEEN 1 AND 10 
ORDER BY RetailerId, `Order` ASC 

不幸的是,我似乎無法找到填充沒有在TopOffer表中的條目此查詢與報價的結果的任何方式,如果有不是該零售商的10個TopOffer記錄。

我對任何幫助提前致以衷心的感謝!

+0

的'RetailerID's兩個表中不匹配10。 –

+0

我列出的實際數據更多的是一個例子,理論上並非所有零售商都需要TopOffer表中的條目 –

回答

0

如果創建編號1-10虛擬表,你可以離開了加入到你的結果得到的每個

select number, results.* 
    from 
     (select 1 as number union select 2 union select 3 ... union select 10) numbers 
      left join 
     (your query here) results 
      on numbers.number = results.rank 
+0

SQLite沒有'rank'。 –

+0

排名是在這種情況下的字段名稱,而不是函數 – podiluska

+0

我想我在我的第一篇文章中解釋得不好;對於零售商少於10個TopOffers的情況,您建議的解決方案是否會產生帶NULL值的Offer記錄? 如果零售商的TopOffers少於10個,我需要在Offer表中填寫實際報價。這就是爲什麼我已經加入了Offers和TopOffers,所以我仍然擁有完整的Offer(大部分TopOffer字段爲NULL值)來執行分組魔法。 –