2
products purchased
--------------------------
bana
bana
bana
stra
kiwi

reward requirements table (related to a rewards table)
reward id, products
----------------------
1,bana
1,bana
1,bana
2,stra
2,bana
3,stra
4,cart
5,bana
5,bana
5,oliv

購入した製品が対象とする報酬を得るために SQL を手伝ってもらえますか?

上記の場合、報酬 ID は次のようになります。

1
2
3

ソリューションをより簡単にするより良い設計があれば、それも歓迎します。説明を簡単にするために製品名を使用していると思います。(後で製品 ID に置き換えます)

4

2 に答える 2

4

このクエリはあなたの問題を解決します。

select r.reward_id
from (
  select reward_id, product, count(*) needed
  from reward_requirements
  group by reward_id, product
) r
left join (
  select product, count(*) bought
  from products_purchased
  group by product 
) p on r.product=p.product and p.bought >= r.needed
group by r.reward_id
having count(reward_id) = count(distinct p.product)
order by r.reward_id

設計を改善するには、reward_requirements をやり直して、複数回リストする代わりに列 (製品、必要) を含めることができます。また、最初のサブクエリも削除されます。

于 2012-10-07T05:44:40.640 に答える
2

このスキーマでは:

CREATE TABLE            product
(
    product_id          int IDENTITY
    , name              varchar(50)
)

CREATE TABLE            requirement
(
    requirement_id      int IDENTITY
    , product_id        int
    , quantity          int
    , reward_id         int
)

CREATE TABLE            reward
(
    reward_id           int IDENTITY
    , reward            varchar(50)
)

CREATE TABLE            purchased
(
    purchased_id        int IDENTITY
    , product_id        int
    , quantity          int
)

クエリは次のようになります。

SELECT      requirement.reward_id
FROM        requirement
            LEFT JOIN purchased
                ON  purchased.product_id = requirement.product_id
                AND purchased.quantity >= requirement.quantity
GROUP BY    requirement.reward_id
HAVING      COUNT(purchased.product_id) = COUNT(requirement.reward_id);

これが SQLFiddle です: http://sqlfiddle.com/#!3/e93c9/7

于 2012-10-07T19:28:04.157 に答える