2017-06-25 3 views
1

Ich habe 2 Tische:Python/Sqlite3: LEFT JOIN mit GROUP_CONCAT

Tasks:      Predecessors: 

ID | Task | Team   ID | TaskID | PredecessorID 
---+------+------   ---+--------+-------------- 
1 | A | 1    1 | 1  | None 
2 | B | 1    2 | 2  | 1 
3 | C | 2    3 | 3  | 1 
4 | D | 2    4 | 3  | 2 
          5 | 4  | None 

I alle Aufgaben von Spieler 2 und fügen Sie die Predecessors für jede Aufgabe durch Komma in dieser Form getrennt auswählen möchten:

ID | Task | Team | Predecessors 
---+------+------+------------- 
3 | C | 2 | 1, 2 
4 | D | 2 | None 

Deshalb verwende ich die folgende SQL-Abfrage:

SELECT Tasks.*, GROUP_CONCAT(Predecessors.PredecessorID) 
FROM Tasks LEFT JOIN Predecessors ON Tasks.ID = Predecessors.TaskID 
WHERE Tasks.Team = 2 GROUP BY Predecessors.TaskID 

, die zurückgibt:

ID | Task | Team | Predecessors 
---+------+------+------------- 
3 | C | 2 | 1, 2 

Was kann ich tun, auch die Zeile mit dem Wert None erhalten zu bekommen?

Hier ist mein Testcode:

# -*- coding: utf-8 -*- 

import sqlite3 


con = sqlite3.connect('test.db') 
cur = con.cursor() 

# Drop old tables if they already exits and create new ones. (For testing). 
cur.execute("""DROP TABLE IF EXISTS Tasks""") 
cur.execute("""DROP TABLE IF EXISTS Predecessors""") 

# Create tables. 
cur.execute("""CREATE TABLE Tasks (ID INTEGER PRIMARY KEY AUTOINCREMENT, 
       Task TEXT, Team INTEGER)""") 
cur.execute("""CREATE TABLE Predecessors (ID INTEGER PRIMARY KEY AUTOINCREMENT, 
       TaskID INTEGER, PredecessorID INTEGER)""") 

# Insert some values. 
sql = """INSERT INTO Tasks (Task, Team) VALUES (?, ?)""" 
for task in [('A', 1), ('B', 1), ('C', 2), ('D', 3)]: 
    cur.execute(sql, task) 

sql = """INSERT INTO Predecessors (TaskID, PredecessorID) VALUES (?, ?)""" 
for predecessor in [(1, None), (2, 1), (3, 1), (3, 2), (4, None)]: 
    cur.execute(sql, predecessor) 

con.commit() 

sql = """SELECT Tasks.*, GROUP_CONCAT(Predecessors.PredecessorID) 
FROM Tasks LEFT JOIN Predecessors ON Tasks.ID = Predecessors.TaskID 
WHERE Tasks.Team = 2 GROUP BY Predecessors.TaskID""" 
cur.execute(sql) 
data = cur.fetchall() 
print data 

con.close() 

Dank für die Hilfe !!

Antwort

2

Das Problem ist die GROUP BY Predecessors.TaskID; Für eine Zeile ohne Übereinstimmungen sind alle Predecessors Spalten NULL.

Verwenden Sie stattdessen GROUP BY Tasks.ID.

+0

Vielen Dank! Würde es Ihnen etwas ausmachen, mir bitte die ganze Frage zu schreiben? (Da ich die GROUP BY-Anweisung zuvor noch nie verwendet habe und nicht genau weiß, wo sie in meine Abfrage eingefügt werden soll) –

+0

Ersetzen Sie sie einfach. –

+0

Entschuldigung, ich habe deine Antwort nicht sorgfältig gelesen. Ich dachte, ich sollte eine GROUP BY-Anweisung anstelle von GROUP_CONCAT verwenden. Das ist Müll. Die GROUP BY-Anweisung löste mein aktuelles Problem! Obnawns Antworten sind auch richtig. –

1

sollten Sie überprüfen Sie sorgfältig Code.Nichts falsch in Ihrem SQL, Sie schreiben nur falsche Testdaten.

your test data[('A', 1), ('B', 1), ('C', 2), ('D', 3)] 
and it should be [('A', 1), ('B', 1), ('C', 2), ('D', 2)] 
+0

Oh, das stimmt! Es tut uns leid. Es hat funktioniert, als ich den Code korrigiert habe, wie du es vermutest! –