2017-11-29 5 views
0

전자 상거래 웹 사이트에서 쿼리를 변경해야합니다. 이 웹 사이트는 고객이 선택한 수량에 따라 각 제품에 대해 여러 가지 가격을 가지고 있습니다.

장바구니에 담긴 제품의 수량이 특정 수치보다 많은 경우, 그 가격은 더 낮을 것입니다.

예를 들어, 수량이 1이면 가격은 $ 10이고, 수량이 20이면 각 제품의 가격이 $ 8로 줄어 듭니다. 내가 WHERE prices.num='1' 라인을 변경하려면MySQL JOIN 쿼리에 조건 추가 : 쿼리의 결과와 동일한 열

SELECT prices.price AS price, prices.product_id AS product_id FROM cart 
LEFT JOIN prices ON prices.product_id = cart.product_id 
WHERE prices.num='1' 
AND cart.id='$cart_id' 

:이 쿼리에서

prices 
id | product_id | num | price 
1 | 111111  | 1 | 10 
2 | 111111  | 20 | 8 
3 | 111111  | 100 | 5 
4 | 222222  | 1 | 42 
5 | 222222  | 50 | 35 

cart 

id | factor_id | product_id | quantity 
1 | 1   | 111111  | 30 
2 | 1   | 222222  | 3 
3 | 2   | 222222  | 1 
4 | 2   | 111111  | 2 

:

여기 내 테이블 구조입니다. 카트의 해당 제품 수량에 따라 가격을 선택해야합니다.

는이 같은 뭔가 도움이 될 생각했지만 각 카트는 다양한 제품을 가질 수 있기 때문에 그것을 사용하는 방법을 모른다 :

SELECT (prices.num - cart.quantity) as nearest, prices.num as priceForThatQuantity 
FROM prices 
WHERE nearest > 0 
ORDER BY nearest ASC 
LIMIT 1 

다음 :

WHERE prices.num='1' = priceForThatQuantity 

내가 생각을 어떤 종류의 JOIN을 사용해야합니다 ...

EDIT : 제품 111111 수량이 20 개 미만인 경우 $ 10, 20 - 100 사이 인 경우 $ 8, 100 개 이상의 r 개.

+0

의 가장 낮은 값과 함께 일치 num의 가장 높은 값을 얻을 수 있습니다 각각의 추가 제품에 대해 각각 감소합니까? 그 테이블은 어디에 있습니까? 아니면 고정 된 비율입니까? – kchason

+0

불행히도 감소는 고정되어 있지 않습니다. 이들은 num 열의'prices' 테이블에 저장됩니다. – Niloofar

+0

샘플 데이터를 제공하십시오. 백분율 또는 달러 금액? 할인 수에 제한이 있습니까? 각각 할인됩니까? 여기에 정의되지 않은 항목이 많이 있습니다. – kchason

답변

0

시도 :이 쿼리

SELECT prices.price AS price, prices.product_id AS product_id FROM cart 
LEFT JOIN prices ON prices.product_id = cart.product_id 
WHERE prices.num in (SELECT quantity FROM cart WHERE cart.id='$cart_id') 
AND cart.id='$cart_id' 
+0

내가 원하는 것은 아니지만 사용자 제품 111111의 16 조각을 주문할 수 있으며, 데이터베이스에 1 개 이상의 조각, 20 개 이상의 조각에 대한 행이 있습니다 ...이 경우 1 조각 이상의 가격이 계산됩니다, 분명히 16 조각은 20 미만이기 때문입니다. – Niloofar

1

시작 :

SELECT * 
FROM cart c 
JOIN prices p 
    ON c.product_id = p.product_id 
    AND c.quantity >= p.num 

최소를 당신은 제품 111111 30> 1 볼 수 있으며, 30> (20)는 그래서 당신은 그룹에 사람들을 필요로하고 질수록 가격은 고유 cart의 행을 식별 무엇 $ (8)

SELECT c.product_id, 
     c.quantity, 
     MIN(p.price) as price 
FROM cart c 
JOIN prices p 
    ON c.product_id = p.product_id 
    AND c.quantity >= p.num 
GROUP BY c.product_id, 
      c.quantity 
1

를 얻으려면? (id,product_id)의 조합?

하나의 옵션은 일치하는 행의 최소 가격을 cart에 골라 내기 위해 GROUP BY 및 MIN() 집계가있는 JOIN입니다. 그러나 cart 행의 일부 고유성이 보장되지 않으면 행을 접을 위험이 있으므로 GROUP BY을 쿼리에 추가하는 것을 주저합니다.

그래서 더 안전한 베팅은 SELECT 목록의 상관 된 하위 쿼리입니다. (이것은 큰 세트에 대해서는 덜 적합하지만 예제 쿼리가 하나의 카트를 가져 오는 것이고 카트에 적당한 수의 아이템이 있고 테이블에 price 테이블에 적합한 인덱스가있는 경우이 역시 우리를 해치지 않을 것입니다 성능면에서 나쁘다.카트는 '20'의 양, 우리가 price의 행과 일치 할 수있는 경우, price 테이블의 여러 행과 일치 할 가능성이 있음을

SELECT (SELECT price.unit_price 
      FROM price 
      WHERE price.product_id = cart.product_id 
      AND price.num  <= cart.quantity 
      ORDER BY price.num DESC 
      LIMIT 1 
     ) AS unit_price 
     , cart.product_id AS product_id 
    FROM cart 
    WHERE cart.id = 'foo' 

참고 :

우리는 이런 일을 할 수 num의 값은 15, 12, 6, 3, 1 ... 그래서 사용할 행을 선택해야합니다. 한 가지 방법은 일치하는 행을 num으로 내림차순으로 정렬하고 첫 번째 행만 가져 오는 것입니다. 위 쿼리는 하위 쿼리의 ORDER BY 및 LIMIT 1을 사용하여 수행합니다. 위로 가입 옵션


은 ... quantity 가능한 모든 값과 일치하는 numprice에 행이있을 보장하지 않는 한

, 우리는 아마 가격의 행에 대해 살펴볼 필요 이 값은 num이고 quantity보다 작거나 같습니다.

JOIN의 조건을 사용하면 여러 행을 일치시킬 수 있습니다. 다음 쿼리는 cart에서 중복 된 product_id을 반환 할 가능성이 있습니다.이 값은 "올바른"결과를 반환하지 않지만 quantitynum의 복수 값과 일치하면 ...

일 때 JOIN 연산의 결과를 보여줍니다.
SELECT cart.product_id 
    , price.num 
    , price.unit_price 
    FROM cart 
    JOIN price 
    ON price.product_id = cart.product_id 
    AND price.num  <= cart.quantity 
WHERE cart.id = 'foo' 
ORDER BY 1,2,3 

GROUP BY을 사용하면 행을 축소하고 집계 함수를 사용하여 가장 낮은 가격을 선택할 수 있습니다. (더 많은 양이 낮은 가격을 생산한다고 가정. 단가는 작은 수량 결코 낮다는 것을 가정 할 때, 우리는 우리가 얼마나 많은함으로써 price

SELECT cart.product_id 
    , MAX(price.num) 
    , MIN(price.unit_price) 
    FROM cart 
    JOIN price 
    ON price.product_id = cart.product_id 
    AND price.num  <= cart.quantity 
WHERE cart.id = 'foo' 
GROUP BY cart.id, cart.product_id 
ORDER BY cart.id, cart.product_id