2016-08-18 3 views
1

Ich habe das folgende Szenario: Nicht sicher, wie es besser erklären, aber krank versuchen, einige SQL-Details und ein gültiges Szenario zu geben.Wie in mehreren Zeilen mit linken inneren Join auf mysql

Ich habe eine Tabelle, die Produkte haben, eine, die die Produkt-Tags hält, und eine, die diejenigen zu einem Produkt hinzugefügt speichert. Ich kann einem Produkt mehrere Tags hinzufügen.

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 
); 

Die SQL-Abfrage mit INNER JOIN gibt mir:

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 

Das Ergebnis gibt mir:

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

ich eine Abfrage machen wollen, die überprüfen, ob Produkt 1 tag1 haben, tag2 und tag3 haben alle 3 Tags angehängt. Stellen Sie sich vor, der Benutzer am Front-End wählt alle Baum-Tags aus, dann möchte ich das Produkt zeigen, auf das alle Baum-Tags verweisen. Aber ich bekomme 3 Zeilen und jede Zeile enthält nur eine Zeile in diesem Beispiel. Was wäre der richtige Weg, dies zu tun?

+0

'WHERE tags.tag_name IN ('Tag1', 'Tag2', 'Tag3') 'und' GROUP BY (Produkt Spalten)' 'und HAVING COUNT (tags.tagid) = 3 '. – Jakumi

Antwort

2

Hier ist die vollständige Abfrage:

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 

Diese Abfrage Ausgang geben nur diejenigen Produkt-ID und Namen, die gegeben in allen drei Variablen beteiligt sind.

Erläuterung:

Nur IN garantiert nicht, dass ein einziges Produkt gegeben, alle drei Tags hält.

Da wollen Sie Ergebnis für jede product deshalb GROUP BY product.id ins Spiel kommt.

Später HAVING COUNT(T.id) = 3 wird verwendet, um diejenigen Produkte herauszufiltern, die alle drei angegebenen Tags enthalten.

WORKING DEMO

+0

Danke funktioniert perfekt! – sdfgg45

1

so dass Sie wollen, wie viele der ausgewählten Tags zählen, um Ihr Produkt zu

verbunden ist
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; 

dies wird Ihnen IDs von Produkten geben, die genau 3-Tags verknüpft haben, wo ids dieser Tags 1,2 sind ,3. Sie können 1,2,3 durch eine andere Auswahl oder eine Variable je nach Ihrer Situation ersetzen.

Verwandte Themen