2014-11-18 2 views
1

이 질문에 대한 어색한 제목을 용서하십시오.조인이 일치하지 않거나 필드가 null 인 경우 테이블에 행 삽입

동일한 product_id 및 가격 (다른 날짜)의 항목을로드하지 않고 일부 제품의 가격을 추적하려고합니다. 160,000 개의 제품이 있으며 매일 업데이트가 실행됩니다.

제품

product_id, price, date_added, date_updated 
(id Primary Key) 

내가 그러나 나는에 의해 가입/선택을 정렬 할 수 없습니다, 다음 쿼리를하고있는 중이 야

product_id, price, date_updated 
(product_id, price, date_updated primary unique) 

price_index :

나는 다음과 같은 테이블이 가장 최근 날짜.

INSERT INTO price_index 
(SELECT p.product_id,p.product_price,p.date_updated FROM products p 
LEFT JOIN price_index pi ON (p.product_id = pi.product_id) 
WHERE (p.product_price <> pi.product_price OR pi.product_price IS NULL)) 

나는이

JOIN (SELECT * FROM price_index ORDER BY date_updated DESC) pi 

에 가입 교체하는 경우 먼저 올바른 정렬을 할 것입니다, 그러나 이것은 어떤 인덱스를 사용하지 않는 것 내 MySQL의 GUI 도구를 동결 유지합니다.

여기서 내가하려고하는 것을 달성하는 더 좋은 방법이 있습니까?

업데이트 : 업데이트 스크립트는 현재 가격으로 제품 테이블을 업데이트합니다. 그런 다음 price_index 테이블에서 확인/업데이트를 수행해야합니다.

+0

왜 거기에 행을 주문해야하는지, 조인을 사용하여 쿼리에서 작동하지 않아야하는 이유는 전혀 없습니다. 어쩌면, 나는 당신의 문제를 정확하게 이해하지 못했을 것입니다. – David162795

+0

David David, 가장 최근의 것이 아닌 price_index 테이블의 첫 번째 항목을 찾은 것으로 보입니다. 가장 최근의 price_index가 업데이트 된 제품 테이블 가격과 다른 경우에만 price_index 테이블에 다른 행을 추가하고 싶습니다. –

+0

명확한 내용을 추가하지 않았습니다. –

답변

0

정확하게 이해하면 가장 최근 가격이 변경된 경우에만 새 행을 삽입하려고합니다. 나는 테이블에 대해 약간 혼란스러워. 귀하의 질의에는 세 가지가 언급되어 있지만 귀하의 텍스트에는 두 가지만 언급되어 있습니다. 나는 product_pricesprice_index이 같은 것으로 가정합니다.

INSERT INTO product_prices(product_id, price, date_updated) 
    SELECT p.product_id, p.product_price, p.date_updated 
    FROM products p LEFT JOIN 
     price_index pi 
     ON p.product_id = pi.product_id AND 
      p.product_price = pi.product_price LEFT JOIN 
     (SELECT product_id, max(date_updated) as maxdu 
      FROM price_index 
      GROUP BY product_id 
     ) pimax 
     ON pi.product_id = pimax.product_id and pi.date_updated = pimax.maxdu 
WHERE pimax.product_id IS NULL; 

이 제품과 가장 최근의 업데이트 날짜에 가격 모두에서 일치하는 항목을 찾기 위해 left join 사용합니다. 3 가지 조건 중 하나라도 일치하지 않으면 삽입이 수행됩니다.

+0

사과 - 내 테이블 이름을 간단하게 유지하려고했는데 product_prices 인스턴스 하나를 price_index로 이름을 바꾸지 못했습니다. 질문을 업데이트했습니다. –

+0

내가 설명하는 것과 비슷한 것을 시도했지만 쿼리가 얼어 붙었다. 아마도 내 버전이 훨씬 효율적이지 않았을까? price_index INSERT INTO 는 (제품 (P)이 LEFT JOIN FROM p.date_updated p.product_id, p.product_price을 선택 (date_updated DESC) 파이 ON (= p.product_id pi.product_id) (p ORDER BY price_index * FROM. product_price <> pi.product_price 또는 pi.product_price IS NULL)) –

+0

@AlexHolsgrove. . . 그것은 전혀 비슷하지 않으며'order by'는 기본 테이블에서 인덱스를 사용하지 못하게하는 것을 제외하고는 아무 것도하지 않습니다. –

관련 문제