[英]SQLite joining tables with no direct relation
我在弄清楚如何從一個以兩種不同方式連接到另一個表的表中選擇數據時遇到問題。 這是我的數據庫模型的圖像:
我要從中選擇的表是項目表。 我想將所有項目連接到給定的用戶。
用戶可以直接成為項目的一部分,而不必成為團隊的一部分。 因此,在這種情況下,通過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我想開始工作。 因此,如何在同一查詢中獲取給定用戶的所有獨立項目和組項目?
您可以對查詢執行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不會從UNION的兩個部分返回重復的值,因此,如果他自己和作為組的一部分在項目中,則查詢僅返回一個結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.