请原谅这个问题的尴尬标题。
我正在努力跟踪某些产品的价格,理想情况下,没有大量具有相同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))
如果我用
替换JOINJOIN (SELECT * FROM price_index ORDER BY date_updated DESC) pi
它将首先进行正确的排序,但是这似乎没有使用任何索引并继续冻结我的MySQL GUI工具。
有没有更好的方法来实现我在这里尝试做的事情?
更新: 更新脚本首先使用当前价格更新产品表。然后我需要在price_index表上执行检查/更新。
答案 0 :(得分:0)
如果我理解正确,您只想在最近的价格发生变化时插入新行。我对桌子有点困惑。您的查询提到三个,但您的文字只提到两个。我假设product_prices
和price_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
在最近的产品和价格和上查找匹配项
更新日期。如果三个条件中的任何一个不匹配,则插入发生。