2017-02-27 5 views
0

Ich habe zwei Tabellen:sql, aggregierte Liste erhalten statt Looping

  1. Aufgabenlisten (id, getan)
  2. Aufgaben (id, tasklist_id, getan)

jetzt möchte ich finden Alle Tasklisten, die auf 0 gesetzt haben und alle ihre Aufgaben auf 1 gesetzt haben, kann ich auch auf 1 setzen.

Ich weiß, wie es zu tun, wenn ich durch jede Liste gehen eins nach dem anderen:

SELECT COUNT(done) 
FROM tasks 
WHERE done != 1 
AND tasklist_id = 13; 

Diese prüft, ob alle Aufgaben der Liste 13 sind getan, aber ich möchte es in einer Art und Weise haben, dass ich Erhalten Sie ein Ergebnis, das alle Listen mit einer Anzahl von 0 für obige Abfrage zeigt.

EDIT: DB = mysql

Abtastdaten:

Tasklisten:

id, done 
1, 0 
2, 0 
3, 0 
4, 1 

Aufgaben:

id, done, tasklist_id 
1, 1, 1 
2, 0, 1 
3, 1, 2 
4, 1, 2 
5, 1, 3 
6, 1, 4 

erwartete Ergebnis:

tasklist_id 
2 
3 

Es sollte nicht 1 enthalten, weil Task nr. 2 (gehört zu Liste 1) ist noch nicht fertig und sollte auch nicht 4 enthalten, da die Liste bereits auf erledigt gesetzt ist.

+1

Sie sagten zu implementieren: 3-Tabellen, wo ist der dritte? – McNets

+1

Fügen Sie einige Beispieltabellendaten und das erwartete Ergebnis hinzu - auch formatierten Text. – jarlh

+0

@a_horse_with_no_name mysql – Chris

Antwort

0

Verwenden not exists um sicherzustellen, dass es keine unvollendete Aufgabe ist:

select id from tasklists tl where done = 0 and not exists (
    select * from tasks where tasklist_id = tl.id and done = 0 
) 

Auch ist es vielleicht eine gute Idee, diese Überprüfung über Update After triggers