MySQL 5.7 самый быстрый способ выбрать последнее из соединения - PullRequest
0 голосов
/ 25 августа 2018

В настоящее время я использую этот запрос, чтобы получить все товары с последней ценой и запасом из таблицы цен:

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 из той же строки?

...