MySQL 5.7从联接中选择最新的最快方法

时间:2018-08-25 14:15:26

标签: mysql join group-by aggregate-functions

当前,我正在使用此查询从价格表中获取具有最新价格和库存的所有产品:

SELECT 
    products.*, 
    prices.price AS latest_price, 
    prices.stock AS latest_stock
FROM products 
LEFT JOIN prices ON prices.id = (
    SELECT id 
    FROM prices 
    WHERE prices.product_id = products.id AND prices.created_at >= '2018-08-18 00:00:00' 
    ORDER BY created_at DESC 
    LIMIT 1
)
WHERE products.shop_id = 1

DB Fiddle

但是,这对于许多产品(数百万)和许多价格(十亿)来说是缓慢的。如何改善此查询?通常,连接速度更快,但是通过连接可以实现吗?我正在尝试:

SELECT
    ANY_VALUE(products.id),
    ANY_VALUE(products.name),
    prices.price, -- Which aggregate function to use?
    MAX(prices.created_at)
FROM products
LEFT JOIN prices ON prices.product_id = products.id AND prices.created_at >= '2018-08-22 00:00:00'
WHERE shop_id = 3
GROUP BY products.id

但是现在我必须指定所有产品列,并用ANY_VALUE()括起来吗? MAX()正在从价格中选择最新的created_at日期,但是如何从同一行中选择price

0 个答案:

没有答案