2016-07-12 6 views
1

Ich habe mir similar questions angesehen, aber ich kann mir nicht vorstellen, wie die Antworten funktionieren, um sie auf meinen Fall anzuwenden.Return-Set (s) ID nur, wenn alle Artikel aus diesem Set ein bestimmtes Kriterium erfüllen

Ich habe Gruppen von Artikeln (set_table)

ID SET ID ART 
1  1 
1  4 
2  1 
2  4 
3  2 
1  3 

Diese Artikel haben eine Tabelle mit ihren Eltern ID. (Article_table)

ID ART ID PARENT 
1  1 
2  3 
3  2 
4  1 

Da nun die Eltern haben einen Zustand sie sich treffen müssen, aber es könnte mehrere sein (parent_table):

PARENT ID GROUP ID 
1   6 
2   15 
3   12 

Bedeutung, ich habe alle Sätze wählen, dessen Artikel (alle sie sind in GROUP 6, dann sollte das Ergebnis ID SET sein: 2. Oder ich könnte alle Sets auswählen müssen, deren Artikel (alle) in GROUP 6 und 15 sind, dann sollte das Ergebnis ID SET sein: 1. Oder Ich könnte alle Sätze auswählen müssen, deren Artikel (alle) in den GRUPPEN 6, 12; dann sollte das Ergebnis NULL sein.

Ich habe versucht:

SELECT parent_id 
FROM parent_table 
WHERE group_id IN (6,15) 
GROUP BY parent_id 
HAVING COUNT(DISTINCT group_id) = 2; -- Number of group ids 

was cool ist, aber ich schaffte es nicht, die Sätze richtig zu filtern, meine Versuche, den Satz bei der Auswahl funktionieren nicht.

+0

Sie alles noch versucht haben? –

+0

ist es nicht klar, was Sie erreichen wollen –

+0

'aber es könnte mehrere sein 'Eh? – Strawberry

Antwort

1

Die folgende Abfrage ist nicht so schmerzhaft, wenn Sie anfangen, es zu schreiben. Fügen Sie einfach die drei Tabellen zusammen und verwenden Sie dann die bedingte Aggregation, um die Anzahl der Einträge in einem ID_SET mit den gewünschten Gruppen zu zählen.

Die folgende Abfrage findet die ID_SET Werte, die Gruppen von entweder 6 oder 12 haben. Beachten Sie, dass dies eine leere Ergebnismenge für die Beispieldaten zurückgibt, die Sie in Ihrer ursprünglichen Frage angegeben haben. Die Unterabfrage DISTINCT wird benötigt, um doppelte Gruppenwerte zu entfernen, die andernfalls die bedingte Aggregation abwerfen würden.

SELECT t.ID_SET, 
    SUM(CASE WHEN t.GROUP_ID IN (6, 12) THEN 1 ELSE 0 END) AS groupCount 
FROM 
(
    SELECT DISTINCT s.ID_SET, p.GROUP_ID 
    FROM set_table s 
    INNER JOIN article_table a 
     ON s.ID_ART = a.ID_ART 
    INNER JOIN parent_table p 
     ON a.ID_PARENT = p.PARENT_ID 
) t 
GROUP BY t.ID_SET 
HAVING groupCount = 2 -- change 2 to however many group values you want to match 
+0

Ich habe dies eine Weile mit den tatsächlichen Tabellen versucht, aber die SELECT innerhalb der INNER JOIN gibt groupCount Werte doppelt (oder verdreifacht einige Male) von dem, was sie sollten ... Ich versuche herauszufinden, warum (vielleicht ist es die Abfrage , vielleicht sind die Daten), aber die Abfrage sieht gut aus! – Tyrannogina

+0

@Ika Ich habe meine Antwort aktualisiert. Ich habe es in der MySQL-Konsole getestet und es scheint zu funktionieren. –

+1

Das ist perfekt !! Diese letzte Version funktioniert reibungslos und es ist einfach genug zu verstehen, wie es funktioniert. Ich habe weniger als ein Jahr programmiert und es ist großartig, Ihre Hilfe zu haben. Hoffentlich kann ich das nächste alleine machen. Vielen Dank! – Tyrannogina

0

Verwenden Sie die folgende Abfrage

select ID ART 
from articles a 
join Parent1 p1 on a.ID ART = p1.ID ART 
join Parent2 p2 on p1.ID PARENT = p2.PARENT ID AND p2.GROUP ID in (6,12) 
+0

Korrigieren Sie mich, wenn ich falsch liege, aber dies würde nicht die Sätze auswählen, und es scheint auch, dass es Artikel in Gruppe 6 oder 12 auswählen würde, aber nicht nur die in beiden. – Tyrannogina

Verwandte Themen