Соединить 2 запроса в 1

194
05 ноября 2021, 19:10

Пытаюсь получить товары у которых нету фото в базе и есть фото у аналогичных товаров. В первом запросе получаем model по которому идет проверка на аналогичные фото. Использую mysqli

Вот запрос на получение всех товаров без фото

SELECT p.product_id, pa.text as model 
FROM " . DB_PREFIX . "product p 
LEFT JOIN " . DB_PREFIX . "product_attribute pa 
    ON(pa.product_id = p.product_id AND pa.attribute_id = '392') 
WHERE p.image IS NULL GROUP BY p.product_id`

Вот для получения фото у аналогичного товара

SELECT DISTINCT(p.image) 
FROM " . DB_PREFIX . "product_attribute pa 
LEFT JOIN " . DB_PREFIX . "product p 
    ON(pa.product_id = p.product_id) 
WHERE pa.text LIKE '".$model."' 
  AND pa.language_id = '".$language_id."' 
  AND pa.attribute_id = '".$attr_id."' 
  AND p.image IS NOT NULL 
GROUP BY p.product_id 
LIMIT 1

Как можно реализовать это все 1 запросом? Тоесть что бы сразу получить товары у которых нету фото из первого запроса и есть аналогичные фото из второго запроса. Товары у которых нету аналогичных фото должны быть отброшены.

Answer 1

У вас в вопросе нету ни СУБД, ни определения понятия «аналогичного товара», поэтому нафантазировал вот так:

WITH product_images(product_id, image, model, language_id) AS (
  SELECT p.product_id
       , p.image
       , pa.text AS model
       , pa.language_id
    FROM product AS p
          JOIN product_attribute AS pa ON p.product_id = pa.product_id
           AND pa.attribute_id = 1
)
SELECT pi.*
     , MIN(extra.image) AS extra_image
  FROM product_images AS pi
        LEFT JOIN product_images AS extra
          ON extra.model LIKE '%' || pi.model || '%'
         AND extra.language_id = pi.language_id
         AND pi.image IS NULL
         AND extra.image IS NOT NULL
 GROUP BY pi.product_id
     , pi.image        -- These aren't actually needed in SQLite, but
     , pi.model        -- PostgreSQL requires these parameters as well
     , pi.language_id  -- so leave them.
;

DB-Fiddle: https://www.db-fiddle.com/f/sssAVXyC6f8mrVE5ZG9MRZ/0

Это работает в PostgreSQL и SQLite. Если у вас что-то не работает, уточняйте как именно результат отличается от вашего, дополнив сам вопрос.

Answer 2

Реализовал это таким способом

SELECT p.product_id, (SELECT pr.image FROM oc_product pr LEFT JOIN oc_product_attribute pat USING(product_id) WHERE pat.text = pa.text AND pr.image IS NOT NULL LIMIT 1) AS image
FROM oc_product_attribute pa
LEFT JOIN oc_product p ON(pa.product_id = p.product_id)
WHERE p.image IS NULL AND pa.attribute_id = '".$attr_id."'
HAVING image IS NOT NULL
READ ALSO
логика при работе с псевдоклассом :hover

логика при работе с псевдоклассом :hover

Первое правило прячет список-подменюВторое - показывает подменю, если на верхний пункт меню (родитель), в котором находится подменю, наведут...

118
Не прогружаются стили css

Не прогружаются стили css

У меня есть заказчик с Турции и у него сайт выглядит так как будто там не прогрузился CSS, а у меня всё норм долго не мог понять в чём проблема...

199