Multi INNER JOIN дает неожиданные дубликаты записей - PullRequest
0 голосов
/ 17 октября 2019

Выполнение следующего запроса SELECT неожиданно дает два раза одну и ту же запись, когда в базе данных есть только 1 продукт. Однако есть несколько подкатегорий, связанных с одной и той же категорией, но я до сих пор не понимаю, почему это дало бы два результата.

ERD:

enter image description here

Полное содержимое БД:

enter image description here

SELECT p.id AS productId, p.name AS productName FROM product p
INNER JOIN product_base AS pb ON pb.id = p.product_base_id
INNER JOIN product_category AS pc ON pc.id = pb.product_category_id
INNER JOIN product_subcategory AS psc ON psc.product_category_id = pc.id;

Возвращает:

enter image description here

Почему этот продукт возвращается два раза?

Добавление WHERE psc.id = 2 все равно даст один продукт, в то время как предполагается, что этот продукт должен быть найден только тогда, когда psc.id = 1.

Что мне здесь не хватает? Что-то не так со структурой? Как получить все продукты, которые имеют определенную подкатегорию?

Нужно ли хранить product_category_id и product_subcategory_id непосредственно в product?

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

DISTINCT отфильтрует дубликаты.

SELECT DISTINCT p.id AS productId, p.name AS productName 
FROM product p
INNER JOIN product_base AS pb ON pb.id = p.product_base_id
INNER JOIN product_category AS pc ON pc.id = pb.product_category_id
INNER JOIN product_subcategory AS psc ON psc.product_category_id = pc.id;
0 голосов
/ 17 октября 2019

@ barmar заставил меня понять, что я просто пропускаю прямой ФК от product до product_subcategory. В противном случае, конечно, отсутствует ссылка между продуктом и подкатегорией.

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