TransWikia.com

LEFT JOIN, как правильно составить запрос

Stack Overflow на русском Asked on December 5, 2021

Подскажите плиз, есть запрос который вытягивает все нужные мне product_id:

SELECT product_id
FROM oc_product_attribute
WHERE
    text IN (".$get_material_item.")
    AND product_id IN (
        SELECT product_id
        FROM oc_product_attribute
        WHERE text IN (".$get_ves_item.")
    )
GROUP BY product_id

Нужно с другой таблицы 'product' получить 'price' и 'image', а с другой таблицы 'product_description' получить 'name'. Тут нужен Left Join? Помогите, пожалуйста составить правильно запрос

One Answer

Так как вы не предоставили информации о названиях полей с идентификатором продукта в таблицах product и product_description, предположу, что существует поле product.id и product_description.product_id.

По поводу Left Join - важно понимать, что Left и Right лишь определяют условную сторону, с которой находится целевая таблица при объединении и практически любое соединение можно написать как в левую сторону, так и в правую. Вам нужно об этом почитать подробнее - концепция совсем не сложная. В комментариях дали пару неплохих ссылок [1] [2]

Приняв указанные выше допущения, результирующий запрос может выглядеть следующим образом:

SELECT
    oca.product_id,
    pr.price,
    pr.image,
    pd.name
FROM
    oc_product_attribute AS oca
    LEFT JOIN 
    product AS pr ON pr.id = oca.product_id
    LEFT JOIN
    product_description AS pd ON pd.product_id = oca.product_id
WHERE
    text IN (".$get_material_item.")
    AND oca.product_id IN (
        SELECT oca2.product_id
        FROM oc_product_attribute AS oca2
        WHERE text IN (".$get_ves_item.")
    )
GROUP BY
    oca.product_id

Обращу внимание, что при повторном указании таблицы в секции FROM в подзапросе, важно разделить вызовы таблиц через алиасы (псевдонимы). В частности, обратите внимание, что таблица oc_product_attribute имеет алиасы oca и oca2. В противном случае вы можете получить некорректную обработку подзапроса (в частности может случится так, что курсоры базы данных в основном запросе и подзапросе будут всегда работать синхронно и, как следствие, вы получите один и тот же product_id в обоих запросах)

Answered by cauf on December 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP