2012-02-07 16 views
0

この後続の問題についてご協力いただける場合は、事前にお寄せいただき、ありがとうございます。MySQL:クエリ内の各グループの結果の数を別のクエリの結果に基づいて制限する

MySQLでは

私は以下の表を持っている:

。SELECT ID、MembersProductsからPRODUCT_ID。

 
Member Products 

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

選択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の数を持つことです。

答えて

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/(コードはコメントボックスに収まらなかったので申し訳ありません。コードに2番目のコメントを追加できませんでした) – StaticMike

+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で十分です)。

+0

おかげでコーヒー!私はコードをテストし、それを動作させることができませんでした。私は最初の2 idsだけを取得し、1行あたり1つのproduct_id(2つの結果)を取得します。私はコードを更新しました...私の更新はここにあります:[code](http://mikesturgill.com/uncategorized/code2/) – StaticMike

+0

これは、あなたがMemberProductsに十分なエントリーを持っていないか、スケジュールの値は? [Here](http://sqlfiddle.com/#!2/8ed0b/1)は、あなたの質問のデータを処理するクエリを表示するsqlfiddleです。 –

関連する問題