2017-06-25 44 views
1

我有2個表:的Python/SQLITE3:LEFT JOIN與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 

我想選擇全部來自二隊任務,並添加前輩們通過這種形式逗號分隔每個任務:

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

所以我用下面的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 

返回:

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

我能做些什麼來獲得獲得與無價值也行?

這裏是我的測試代碼:

# -*- 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() 

感謝您的幫助!

回答

2

問題是GROUP BY Predecessors.TaskID;對於沒有匹配的行,所有Predecessors列都是NULL。

改爲使用GROUP BY Tasks.ID

+0

謝謝!你介意給我寫整個查詢嗎? (因爲我以前從未使用GROUP BY語句,並且不知道確切位置在我的查詢中) –

+0

只需將其替換即可。 –

+0

對不起,我沒有仔細閱讀你的答案。我以爲我應該使用GROUP BY語句而不是GROUP_CONCAT。那是垃圾。 GROUP BY聲明解決了我的實際問題!而obgnaws的答案也是正確的。 –

1

你應該仔細檢查你的代碼。你的sql中沒有錯誤,你只是寫錯了測試數據。

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

哦,沒錯!抱歉。當我按照你的想法修正了代碼時,它就起作用了! –