Mysql pivot join завершается неудачно - PullRequest
0 голосов
/ 11 января 2020

У меня есть следующие таблицы

Метки

id | tag_name | slug |
1 | tag1 |tag1
2 | tag1 |tag1

продукты

id | proudct_name
1|product1
2|product2

product_tags

id | product_id | tag_id 

1|1||1
2|1|2
3|2|1

мне нужно получить только тот продукт, который принадлежит и tag1, и tag2

select * from `products` INNER JOIN product_tags ON products.id=product_tags.product_id

INNER JOIN tags ON tags.id=product_tags.tag_id WHERE product_tags.tag_id=1 AND product_tags.tag_id=2

Но мой запрос возвращает пустой результат

Ответы [ 2 ]

1 голос
/ 11 января 2020

Это будет выглядеть продукт, который в обеих таблицах:

select * from `products` a where exists(select 1 from product_tags b where b.tag_id = 1 and a.product_id = b.product_id) and exists(select 1 from product_tags b where b.tag_id = 2 and a.product_id = b.product_id)
0 голосов
/ 11 января 2020

Вы можете делать то, что вы хотите, с помощью inner join, который, кажется, то, что вы пытаетесь. Вам просто нужно inner join дважды:

select p.*
from products p join
     product_tags pt1
     on pt1.product_id = p.id and pt1.tag_id = 1 join
     product_tags pt2
     on pt2.product_id = p.id and pt2.tag_id = 2;

Это может быть проще для кодирования в Laravel.

Ваша версия не работает, поскольку тег не может быть одновременно "1" и «2» одновременно - он может иметь разные строки с этими значениями, но только одно значение на строку.

Кроме того, таблица tags не требуется для запроса.

...