MySQL:根据另一个查询的结果限制查询中每个组的结果数

时间:2012-02-07 04:15:12

标签: mysql sql select join

我想提前感谢所有人在以下问题上提供的任何帮助。

在mysql中我有以下表格:

从MembersProducts选择id,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

我的目标是让每个id的(TimesPerDay * TimesPerWeek)列限制product_id的数量。

2 个答案:

答案 0 :(得分: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次”的选择,其中n每组也不同。

WHERE计算已经选择了多少其他产品,只有在选择不够时才选择它们(足够的是TimesPerDay * TimesPerWeek)。

答案 1 :(得分: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;

丑陋的样子,但这将完全符合你的需要。