@we1

Почему может неправильно работать JOIN в MYSQL?

Есть две таблицы:
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 работает так странно. Или он так и должен работать, а я просто не умею читать инструкцию?
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
JOIN так и работает. Он соответствует декартовому произведению, где для каждой строки из первой таблицы дописывается каждая строка из второй (с учётом условий ON).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы