如果join不匹配或field为null,则将行插入表中

时间:2014-11-18 10:25:56

标签: mysql

请原谅这个问题的尴尬标题。

我正在努力跟踪某些产品的价格,理想情况下,没有大量具有相同product_id和价格(不同日期)的条目。有160,000种产品,每天都有更新。

我有以下表格:

产品

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

price_index

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

我正在执行以下查询,但是我无法按最近的日期对select / join进行排序。

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
JOIN (SELECT * FROM price_index ORDER BY date_updated DESC) pi

它将首先进行正确的排序,但是这似乎没有使用任何索引并继续冻结我的MySQL GUI工具。

有没有更好的方法来实现我在这里尝试做的事情?

更新: 更新脚本首先使用当前价格更新产品表。然后我需要在price_index表上执行检查/更新。

1 个答案:

答案 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在最近的产品和价格上查找匹配项 更新日期。如果三个条件中的任何一个不匹配,则插入发生。