В настоящее время я использую этот запрос, чтобы получить все товары с последней ценой и запасом из таблицы цен:
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
из той же строки?