2012-10-07 3 views
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으로 보상을 받으려면 제품을 구입할 수 있습니까? 보상 IDS 위의 경우 보상 대상 제품

은 다음과 같습니다

1 
2 
3 

솔루션 쉽게 내가 그뿐만 아니라 환영 만들 수있는 더 나은 디자인이있는 경우. 나는 설명하기 쉽도록 제품명을 사용하고 있습니다. (나중에 제품 ID로 바꿀 것입니다.)

+0

당신이 보상을 요구 테이블이 무엇을 의미하는지 설명 할 수는? 2 개의 '바나나'와 1 개의 '올리브'를 구입 한 경우에만 5 점을 얻으실 수 있습니까? 2가 stra 또는 bana 중 하나에 대해 보상을 받습니까? 'products' 칼럼에 쉼표로 구분 된 목록이 실제로 있습니까? – HABO

+0

그것은 AND 조건입니다. 당신은 모두 자격을 갖추어야합니다. 포상 2를 위해 당신은 둘 다 가지고 있어야한다. 보상 아이디 1에는 요구 사항을 충족시키기 위해 3 개의 바나가 필요합니다. – Rod

+0

아니요 쉼표로 구분, 죄송합니다 내 실수. – Rod

답변

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을 다시 수, 더 나은 디자인을 확인하십시오. 또한 첫 번째 하위 쿼리를 제거합니다. 이 스키마와

2

: 여기

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입니다 :

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 
) 

귀하의 쿼리가됩니다 http://sqlfiddle.com/#!3/e93c9/7

관련 문제