2012-02-07 68 views
0

我想預先感謝所有人,希望能就以下問題提供任何幫助。MySQL:根據另一個查詢的結果限制查詢中每個組的結果數

在MySQL我有以下表:

選擇ID,從MembersProducts PRODUCT_ID;

 
Member Products 

id | product_id 
1 | 2 
1 | 3 
1 | 4 
1 | 5 
1 | 6 
2 | 5 
2 | 6 

從Schedule中選擇ID(TimesPerDay * TimesPerWeek)

 
Schedule 
id | (TimesPerDay * TimesPerWeek) 
1 | 2 
2 | 1 

我想創建一個生成以下表的查詢:

 
Member Products 

id | product_id 
1 | 2 
1 | 3 
2 | 5 

我的目標是有PRODUCT_ID由(TimesPerDay * TimesPerWeek)列每個ID限制的數量。

回答

0
select e.id, e.product_id 
from (select @rank:=CASE WHEN @ranked <> id THEN 1 ELSE @rank+1 END as rank, 
      id, 
      product_id, 
      @ranked:=id 
     from 
      (select @rank := -1) a, 
      (select @ranked :=- 1) b, 
      (select * from member_products order by id) c 
    ) e 
inner join (select id, (TimesPerDay * TimesPerWeek) as times from schedule) sch 
    on sch.id = e.id and e.rank <= sch.times; 

醜陋的樣子,但這會做到你所需要的。

+0

嗨弗朗西斯科,非常感謝你的回覆!對不起,延遲迴應,剛下班。在嘗試公式後,我認爲內連接正在工作,因爲每個ID的結果數量正常工作。 product_id並不幸運。它會顯示相同的product_id 18次,然後轉到下一個。它總是從1開始。我確實需要更新代碼以適合我的確切需要。這裏是更新:http://mikesturgill.com/uncategorized/code/(對不起,代碼不適合在評論框中,我不能添加第二個評論的代碼) – StaticMike 2012-02-08 01:42:58

+0

那麼,只要你做到了,並且一路上學到了一些東西! – 2012-02-08 01:47:56

1
SELECT mp.* 
FROM MembersProducts mp 
LEFT JOIN Schedule s ON mp.id=s.id 
WHERE (SELECT COUNT(*) 
     FROM MembersProducts mp2 
     WHERE mp2.id=mp.id 
     AND mp2.product_id<mp.product_id 
) < s.TimesPerDay*s.TimesPerWeek 

這裏做的事情基本上是「最偉大的正每個組」選擇在那裏n每組也各不相同。

WHERE計算已經選擇了多少其他產品,並且只在未選擇足夠的時間(足夠TimesPerDay * TimesPerWeek)時才選擇它們。

+0

感謝咖啡!我測試了代碼,但無法使其正常工作。我只得到前2個ID,每行只有1個product_id(2個結果)。我沒有更新代碼...這裏是我的更新:[代碼](http://mikesturgill.com/uncategorized/code2/) – StaticMike 2012-02-08 01:49:56

+0

也許這是因爲你沒有足夠的條目在MemberProducts中選擇,或因爲你的計劃值? [Here](http://sqlfiddle.com/#!2/8ed0b/1)是一個sqlfiddle,顯示查詢處理您的問題中的數據。 – 2012-02-08 02:23:08