Оптимизация сложного 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 шт):

Автор решения: 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.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;

Бэктики и алиас БД удалены.

→ Ссылка