I持っているなどMySQLのLEFTは、すべての結果が返されない、JOIN
「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」に画像がない場合、その製品の行は検索されません。ここでの唯一の違いは、この部分です: "AND pi
= 1 preset
。" WHERE
敗北あなたの目標(INNER
のようなあなたのLEFT JOIN
振る舞う)で
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`
は 'LEFT JOIN'を使用すると、左テーブルのすべてのデータが取得され、代わりに' RIGHT JOIN'が使用されます – diEcho