Пытаюсь получить товары у которых нету фото в базе и есть фото у аналогичных товаров. В первом запросе получаем 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 запросом? Тоесть что бы сразу получить товары у которых нету фото из первого запроса и есть аналогичные фото из второго запроса. Товары у которых нету аналогичных фото должны быть отброшены.
У вас в вопросе нету ни СУБД, ни определения понятия «аналогичного товара», поэтому нафантазировал вот так:
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. Если у вас что-то не работает, уточняйте как именно результат отличается от вашего, дополнив сам вопрос.
Реализовал это таким способом
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
Виртуальный выделенный сервер (VDS) становится отличным выбором
Первое правило прячет список-подменюВторое - показывает подменю, если на верхний пункт меню (родитель), в котором находится подменю, наведут...
У меня есть заказчик с Турции и у него сайт выглядит так как будто там не прогрузился CSS, а у меня всё норм долго не мог понять в чём проблема...