MySQL LEFT JOIN не возвращает все результаты - PullRequest
1 голос
/ 22 июня 2011

У меня есть запрос, который объединяет некоторые таблицы, чтобы получить список продуктов, включая цены, изображения, страну и т. Д.

В таблице «product_images» может быть ноль или более изображений, но должно быть возвращено только изображение по умолчанию.Моя проблема в том, что в любом случае запрос должен возвращать результат для продукта, даже если в таблице «product_images» нет изображения для этого конкретного продукта.

В первом примере запроса будет возвращена строка для каждого продуктано просто верните случайное изображение:

SELECT `cp`.`category_id`, `p`.`id`, `p`.`master`, `p`.`status`, `p`.`sortorder`, `p`.`sku`, `p`.`stock`, `pd`.`name`, `pd`.`short_description`, `pd`.`description`, `pd`.`slug`, `pi`.`image`, `pi`.`path`
FROM `categories_products` AS `cp`
JOIN `products` AS `p` ON (`cp`.`product_id` = `p`.`id`)
JOIN `product_descriptions` AS `pd`
ON (`pd`.`product_id` = `p`.`id`)
LEFT JOIN `product_images` AS `pi`
ON (`pi`.`product_id` = `p`.`id`)
WHERE `cp`.`category_id` = 34
AND `pd`.`locale_id` = 1
AND `p`.`master` = '0'
AND `p`.`status` = '1'
AND `p`.`accessible` = '1'
AND `pd`.`status` = '1'
GROUP BY `p`.`id`
ORDER BY `p`.`sortorder`

Ниже запроса вернет изображение по умолчанию.Но если в «product_images» нет изображения, строка для этого продукта не будет получена.Единственная разница здесь заключается в следующем: «И pi. preset = 1»

SELECT `cp`.`category_id`, `p`.`id`, `p`.`master`, `p`.`status`, `p`.`sortorder`, `p`.`sku`, `p`.`stock`, `pd`.`name`, `pd`.`short_description`, `pd`.`description`, `pd`.`slug`, `pi`.`image`, `pi`.`path`
FROM `categories_products` AS `cp`
JOIN `products` AS `p` ON (`cp`.`product_id` = `p`.`id`)
JOIN `product_descriptions` AS `pd`
ON (`pd`.`product_id` = `p`.`id`)
LEFT JOIN `product_images` AS `pi`
ON (`pi`.`product_id` = `p`.`id`)
WHERE `cp`.`category_id` = 34
AND `pi`.`preset` = 1
AND `pd`.`locale_id` = 1
AND `p`.`master` = '0'
AND `p`.`status` = '1'
AND `p`.`accessible` = '1'
AND `pd`.`status` = '1'
GROUP BY `p`.`id`
ORDER BY `p`.`sortorder`

Ответы [ 2 ]

4 голосов
/ 22 июня 2011
 `pi`.`preset` = 1

в WHERE побеждает вашу цель (ваш LEFT JOIN ведет себя как INNER).Переместите его на ON:

LEFT JOIN `product_images` AS `pi`
ON (`pi`.`product_id` = `p`.`id` AND `pi`.`preset` = 1)
2 голосов
/ 22 июня 2011

Вы можете предпочесть использовать подзапрос:

LEFT JOIN (SELECT * FROM product_images WHERE preset = 1) AS pi ON ...

В противном случае предложение WHERE применяется ко всему запросу, и если изображение отсутствует, WHERE pi.preset=1 уменьшит ваш поиск до нуля строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...