Есть две таблицы:
products = ID товара, название
products_price = ID товара, цена, валюта, продавец
Важно, что на один товар может быть несколько цен с одинаковой или разной валютой. Есть два запросы, которые позволяют получить некий список товаров с ценами (цена тут выбирается фактически случайно, хотя хотелось бы, чтобы была минимальная либо средняя, либо вообще как-то контролировалась, но вопрос не про это).
Вот два запроса
SELECT `product_id`, `title`
FROM `products`
WHERE `category_id`=:catid
ORDER BY `title`
SELECT `product_id`,`price`
FROM `products_price`
WHERE `currency`="USD" AND `product_id` IN (
SELECT `product_id` FROM `products` WHERE `category_id`=:catid
)
GROUP BY `product_id`
Получается два списка, из которых можно как-то собрать один список средставми PHP (или чем-то еще).
Но я хочу сразу получить список вида:
product_id,title,price
Пробую так
SELECT p.`product_id`, p.`title`, b.`price`
FROM `products` AS p
LEFT JOIN `products_price` AS b ON ( p.`product_id`=b.`product_id` )
WHERE p.`category_id`=:catid AND b.`currency`="USD"
ORDER BY p.`title` ASC
У меня получается, что если цен несколько (в USD), то в списке получается несколько одинаковых товаров. То есть все товара дублируются. Я меняю LEFT/RIGHT, INNER/OUTER и не вижу никакой разницы.
Вроде бы решает проблему GROUP BY p.`product_id`, но хочется понять, почему JOIN работает так странно. Или он так и должен работать, а я просто не умею читать инструкцию?