2016-08-18 3 views
1

У меня есть следующий сценарий: Не знаю, как это объяснить, но старайтесь дать некоторые данные sql и действительный сценарий.Как совместить несколько строк, используя левое внутреннее соединение в mysql

У меня есть таблица, в которой есть продукты, в которых хранятся теги продукта, и которые сохраняют те, которые добавлены в продукт. Я могу добавить несколько тегов к одному продукту.

CREATE TABLE product(
    id INT auto_increment primary key, 
    name varchar(255) 
); 

CREATE TABLE tags(
    id INT auto_increment primary key, 
    tag_name varchar(255) 
); 

CREATE TABLE product_tag(
    id INT auto_increment primary key, 
    tag_id INT, 
    product_id INT 
); 

SQL-запрос с использованием внутреннего соединения дает мне:

select 
product.name, 
tags.tag_name 
from product 
INNER JOIN product_tag ON product.id = product_tag.product_id 
INNER JOIN tags ON product_tag.tag_id = tags.id 

Результат дает мне:

Product 1 | Tag1 
Product 1 | Tag2 
Product 1 | Tag3 
Product 2 | Tag1 
Product 2 | Tag3 

Я хочу, чтобы сделать запрос, проверить, если продукт 1 имеет tag1, tag2 и tag3 имеют все 3 метки. Представьте, что пользователь на переднем конце выбирает все древовидные теги, а затем я хочу показать продукт, на котором есть все теги дерева, на которые он ссылается. Но я получаю 3 строки, и каждая строка содержит только одну строку в этом примере. Каким будет правильный способ сделать это.

+0

'ГДЕ tags.tag_name IN ('Tag1', 'tag2', 'Tag3') и' GROUP BY (столбцы продукта) и 'HAVING COUNT (tags.tagid) = 3 '. – Jakumi

ответ

2

Вот полный запрос:

SELECT 
P.id, 
P.name 
FROM product_tag PT 
INNER JOIN tags T ON PT.tag_id = T.id 
INNER JOIN product P ON PT.product_id = P.id 
WHERE T.tag_name IN ('Tag1','Tag2','Tag3') 
GROUP BY PT.product_id 
HAVING COUNT(T.id) = 3 

Этот запрос даст выводится только те идентификатор продукта и имена, которые участвуют во всех трех тегов данных.

Объяснение:

Только IN не гарантирует, что один продукт содержит все три тега данные.

Поскольку вы хотите получить результат для каждого product, поэтому GROUP BY product.id вступает в игру.

Позже HAVING COUNT(T.id) = 3 используется для отфильтровывания тех продуктов, которые содержат все три указанных тега.

WORKING DEMO

+0

Спасибо, работает отлично! – sdfgg45

1

так что вы хотите, чтобы подсчитать, сколько из выбранных тегов ваш продукт связан с

SELECT p.id, count(p.id) as tag_count FROM product p INNER JOIN product_tag pt ON p.id = pt.product_id WHERE pt.tag_id IN (1,2,3) GROUP BY p.id HAVING tag_count = 3; 

это даст вам идентификаторы продуктов, которые имеют ровно три метки связаны, где идентификаторы этих тегов 1,2 , 3. Вы можете заменить 1,2,3 другим выбором или переменной в зависимости от вашей ситуации.

Смежные вопросы