2016-10-11 3 views
1

최근에 생성 된 제품 가격을 얻으려고합니다. 모든 제품은 고유하지만 가격이 다를 수 있습니다. 제품이있는 경우에는 내 쿼리는 더 PRODUCT_PRICE 테이블의 행으로 가격에 비해 작동 : 난 그냥 최근 생성 된 가격 행을 필요LEFT JOIN은 테이블에 단 하나의 열만 있으면 NULL을 반환합니다.

SELECT 
    i.name AS title, 
    i.id AS product_id, 
    m.name AS manufacturer, 
    image, 
    price_sales, 
    price_new, 
    price_used, 
    price_old 
FROM product_info as i 
    LEFT JOIN product_manufacturer AS m ON i.manufacturer_id = m.id 
    LEFT JOIN (SELECT * FROM product_price ORDER BY created_at DESC LIMIT 1) AS p ON i.id = p.id_product 
WHERE category_id = 2 
    AND i.is_deactivated IS NULL 
LIMIT 0, 20; 

: Table product_price

내 쿼리입니다 .

Result

답변

1

당신이 가진 문제는 그 하위 쿼리입니다 :

(SELECT * FROM product_price ORDER BY created_at DESC LIMIT 1) 

제품 별 최신 가격, 그러나 단순히 최신 가격을 얻을하지 않습니다, 그래서 오직만을 의미 한 행을 반환합니다 제품 중 하나에 실제로 가격이 책정됩니다.

이 문제를 해결하는 방법은 간단 당신은 가격 테이블에 단지를 보면, 그래서 새로운 하나가 존재하는 가격을 제거하는 것입니다, 다음은 당신에게 최신 제품 가격을 줄 것이다 :

SELECT p.* 
FROM product_price AS p 
WHERE NOT EXISTS 
     ( SELECT 1 
      FROM product_price AS p2 
      WHERE p2.id_product = p.id_product 
      AND  p2.created_at > p.created_at 
     ); 

(내가 더 잘 전자가 전달하는 의도를 생각하지만) 그러나 MySQL will optmise LEFT JOIN/IS NULL better than NOT EXISTS, 그래서보다 효율적인 접근 방법은 다음과 같습니다

:

SELECT p.* 
FROM product_price AS p 
     LEFT JOIN product_price AS p2 
      ON p2.id_product = p.id_product 
      AND p2.created_at > p.created_at 
WHERE p2.id IS NULL; 

마지막으로, 당신의 주요 질문이 다시 도입, 당신은 끝낼 것

SELECT i.name AS title, 
     i.id AS product_id, 
     m.name AS manufacturer, 
     i.image, 
     p.price_sales, 
     p.price_new, 
     p.price_used, 
     p.price_old 
FROM product_info as i 
     LEFT JOIN product_manufacturer AS m 
      ON m.id = i.manufacturer_id 
     LEFT JOIN product_price AS p 
      ON p.id_product = i.id 
     LEFT JOIN product_price AS p2 
      ON p2.id_product = p.id_product 
      AND p2.created_at > p.created_at 
WHERE i.category_id = 2 
AND  i.is_deactivated IS NULL 
AND  p2.id IS NULL 
LIMIT 0, 20; 
+0

큰 감사, 그것은 완벽하게 작동합니다 =) –

관련 문제