2011-06-22 13 views
1

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` 
+0

は 'LEFT JOIN'を使用すると、左テーブルのすべてのデータが取得され、代わりに' RIGHT JOIN'が使用されます – diEcho

答えて

4
`pi`.`preset` = 1 

ONに移動:

LEFT JOIN `product_images` AS `pi` 
ON (`pi`.`product_id` = `p`.`id` AND `pi`.`preset` = 1) 
+0

ああ、私のサブクエリソリューションよりも簡単です! – mingos

2

あなたは、サブクエリを使用することを好むことがあります。

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

そうでない場合は、WHERE句はクエリ全体に適用され、何の画像がありません場合は、WHERE pi.preset=1検索を削減しますゼロ行に設定します。

関連する問題