2013-11-24 42 views
1

我有問題搞清楚如何從兩個不同的方式連接到另一個表的一個表中選擇數據。這裏是我的數據庫模型的圖像: enter image description hereSQLite加入表沒有直接關係

我想從中選擇的表是項目表。我想讓所有項目連接到給定的用戶。

用戶可以直接作爲項目的一部分,不需要成爲組的一部分。所以在這種情況下,用戶到項目的連接是通過project_participants表進行的。 但現在..讓我們說用戶是一個組的一部分,這個組通過group_project表連接到一個項目。現在我該如何讓這個項目出現在我的結果中?

我得到的SQL語句能夠獲得直接連接到用戶的項目。該聲明是這樣的:

Cursor c = database 
      .rawQuery(
        "SELECT p.*, pt.deadline FROM " 
          + project_table 
          + " p JOIN project_task pt " 
          + "ON pt.project_id_foreign = p._id " 
          + " JOIN " 
          + project_participants_table 
          + " pp " 
          + "ON pp.project_id_foreign = p._id AND pp.user_id_foreign = ? " 
          //+ "JOIN " 
          //+ group_project_table 
          //+ " gp ON //gp.project_id_foreign = p._id " 
          //+ "AND EXISTS(SELECT group_id_foreign " 
          //+ "FROM group_participants " 
          //+ "WHERE user_id_foreign = ?) ", 
        new String[] { String.valueOf(userId) }); 

我註釋掉該行正試圖獲得工作的JOIN IM。 那麼,我如何才能在同一個查詢中爲給定用戶獲取所有獨立項目和組項目?

回答

1

你可以做一個UNION與獲得用戶是在項目查詢:

SELECT p.*, pt.deadline 
FROM project_table p 
INNER JOIN project_task pt 
    ON pt.project_id_foreign = p._id 
INNER JOIN project_participants_table pp 
    ON pp.project_id_foreign = p._id AND pp.user_id_foreign = ? 
UNION 
SELECT p.*, pt.deadline 
FROM project_table p 
INNER JOIN project_task pt 
    ON pt.project_id_foreign = p._id 
INNER JOIN group_project gp 
    ON gp.project_id_foreign = p._id 
INNER JOIN groups g 
    ON gp.group_id = g._id 
INNER JOIN group_participants gps 
    ON gps.group_id_foreign = g._id 
WHERE gps.user_id_foreign = ? 

這將讓該用戶是從兩個路徑的項目,但因爲聯盟不返回來自UNION兩個部分的重複值,如果他自己在項目中並作爲組的一部分,則查詢只返回一個結果。

+0

謝謝您的回答。我會馬上測試 –

+0

看起來像是有效的。非常感謝! :) –