我无法确定如何从一个表中选择数据,这些表以两种不同的方式连接到另一个表。这是我的数据库模型的图像:
我想要选择的表是项目表。我想让所有项目都与给定用户相关联。
用户可以直接成为项目的一部分,而不必成为组的一部分。因此,在这种情况下,从用户到项目的连接是通过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。 那么,如何在同一个查询中获取给定用户的所有独立项目和组项目?
答案 0 :(得分: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不会从UNION的两个部分返回重复值,如果他自己在项目中并作为组的一部分,则查询只返回一个结果。