2016-08-18 38 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

'WHERE 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 

這個查詢將給輸出只有那些產品ID和參與給所有的三個標籤名稱。

說明:

只有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; 

所選擇的標籤,這將讓你體會到有完全相同3個標籤相關的產品,在這些標籤的ID是1,2 IDS ,3。您可以根據您的情況將1,2,3替換爲另一個選擇或變量。

相關問題