Оптимизация сложного MYSQL запроса
Имеется mysql запрос который выводит список продуктов в корзине
на входе имеется guests_carts. id_guest
в котором есть поля id id_storage id_guest quantity которая в свою очередь смотрит в "склад" по id_storage
склад это products_storage с полями id id_product vendor quantity cost price price_ws1 price_ws2 price_ws3 у склада есть id_product который привязан к товару products
у которого есть поля id status order id_category id_brand id_quantity_name id_default_storage name_ru name_uk name_en desc_ru desc_uk desc_en badge_config badge_ru badge_uk badge_en
так же есть картинки products_images у которых есть поля id id_product order file_name
из которых на каждую позицию в корзине надо выбрать ОДНУ картинку, которая соотв. id_product и при этом имеет минимальный order
я пытался вставить WHERE в подзапрос SELECT products_images..... но не знаю как передать в подзапрос id_product, а в данный момент каждый раз полностью выгружаются все картинки для последующего выбора, что как по мне очень негативно повлияет на производительность...
SELECT `tmp_carts`.`quantity` , `tmp_storage`.`id` , `tmp_storage`.`id_product` , `tmp_storage`.`price` , `tmp_storage`.`price_ws1` , `tmp_storage`.`price_ws2` , `tmp_storage`.`price_ws3` , `tmp_images`.`file_name` , `tmp_products`.`name_ru` , `tmp_products`.`name_uk` , `tmp_products`.`name_en`
FROM `xs_sport`.`guests_carts` AS `tmp_carts`
LEFT JOIN `xs_sport`.`products_storage` AS `tmp_storage` ON `tmp_carts`.`id_storage` = `tmp_storage`.`id`
LEFT JOIN (
SELECT `products_images`.`file_name` , `products_images`.`id_product`
FROM `xs_sport`.`products_images`
ORDER BY `products_images`.`order` ASC
) AS `tmp_images` ON `tmp_storage`.`id_product` = `tmp_images`.`id_product`
LEFT JOIN `xs_sport`.`products` AS `tmp_products` ON `tmp_storage`.`id_product` = `tmp_products`.`id`
WHERE `tmp_carts`.`id_guest` =7
GROUP BY `tmp_carts`.`id`
ORDER BY `tmp_carts`.`id` DESC
LIMIT 3
Извините если не достаточно понятно объяснил вопрос, я впервые тут пишу от безысходности
Низкий поклон человеку с ником Akina, чутка доработав его запрос вот что вышло:
SELECT tmp_carts.quantity ,
tmp_storage.id ,
tmp_storage.id_product ,
tmp_storage.price ,
tmp_storage.price_ws1 ,
tmp_storage.price_ws2 ,
tmp_storage.price_ws3 ,
( SELECT tmp_images.file_name
FROM products_images AS tmp_images
WHERE tmp_storage.id_product = tmp_images.id_product
ORDER BY tmp_images.order ASC LIMIT 1 ) AS file_name,
tmp_products.name_ru ,
tmp_products.name_uk ,
tmp_products.name_en
FROM ( SELECT *
FROM guests_carts
WHERE id_guest = 7
ORDER BY id DESC LIMIT 3 ) AS tmp_carts
LEFT JOIN products_storage AS tmp_storage ON tmp_carts.id_storage = tmp_storage.id
LEFT JOIN products AS tmp_products ON tmp_storage.id_product = tmp_products.id;
Ответы (1 шт):
Навскидку получается что-то вот такое:
SELECT tmp_carts.quantity ,
tmp_storage.id ,
tmp_storage.id_product ,
tmp_storage.price ,
tmp_storage.price_ws1 ,
tmp_storage.price_ws2 ,
tmp_storage.price_ws3 ,
( SELECT tmp_images.filename
FROM products_images AS tmp_images
WHERE tmp_storage.id_product = tmp_images.id_product
ORDER BY products_images.order ASC LIMIT 1 ) AS filename,
tmp_products.name_ru ,
tmp_products.name_uk ,
tmp_products.name_en
FROM ( SELECT *
FROM guests_carts
WHERE id_guest = 7
ORDER BY id DESC LIMIT 3 ) AS tmp_carts
LEFT JOIN products_storage AS tmp_storage ON tmp_carts.id_storage = tmp_storage.id
LEFT JOIN products AS tmp_products ON tmp_storage.id_product = tmp_products.id;
Бэктики и алиас БД удалены.