Vinzenz Mai: Komplizierte SQL-Abfrage mit JOIN und IN

Beitrag lesen

Hallo Benjamin,

Das habe ich gerade mal ausprobiert. Leider klappt das so nicht.

Du könntest wie folgt vorgehen:

1. Schritt:
Welchen ids sind überhaupt die gesuchten Tags zugeordnet?

  
SELECT DISTINCT       -- Gib mir die eindeutigen  
    i.id AS id,       -- ids aus der Tabelle information  
    tags.tag          -- und zugeordneten tags aus der Tabelle tags  
FROM  
    information i     -- wobei die Tabelle information  
INNER JOIN            -- mit der Tabelle  
    tagged t          -- tagged  
ON t.infoId = i.id    -- über die Felder id (information) bzw. infoId  
                      -- (tagged) verknüpft ist und die Tabelle tagged  
INNER JOIN            -- mit der Tabelle  
    tags              -- tags  
ON                    -- über die Felder tagId (tagged) und id (tags)  
    tags.id = t.tagId -- verknüpft ist  
WHERE                 -- wobei mich nur die Tags aus  
    tags.tag IN ('keyword1', 'keyword2') -- vorgegebener Liste interessieren  

2. Schritt:
Zähle, wie oft welche id vorkommt und filtere nur die aus,
die zweimal vorkommen.

  
SELECT  
    s.id                  -- Wähle aus dem Ergebnis obiger Abfrage, die  
                          -- mit dem Namen s angesprochen wird, die ids  
                          -- aus, die ...  
FROM (  
    SELECT DISTINCT  
        i.id AS id,  
     tags.tag  
    FROM  
        information i  
    INNER JOIN  
        tagged t  
    ON  
        t.infoId = i.id  
    INNER JOIN  
        tags  
    ON  
        tags.id = t.tagId  
    WHERE  
        tags.tag IN ('keyword1', 'keyword2')  
) s                       -- Festlegung des Aliasnamens für die Abfrage  
GROUP BY  
    s.id  
HAVING COUNT(s.id) = 2    -- ... genau zweimal vorkommen  

Du kannst problemlos diese Abfrage um alle Spalten erweitern, die eindeutig
von s.id abhängen (und nach diesen Feldern gruppieren).

Freundliche Grüße

Vinzenz