SQLite连接表没有直接关系

时间:2013-11-24 17:31:14

标签: android sql sqlite

我无法确定如何从一个表中选择数据,这些表以两种不同的方式连接到另一个表。这是我的数据库模型的图像: enter image description here

我想要选择的表是项目表。我想让所有项目都与给定用户相关联。

用户可以直接成为项目的一部分,而不必成为组的一部分。因此,在这种情况下,从用户到项目的连接是通过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。 那么,如何在同一个查询中获取给定用户的所有独立项目和组项目?

1 个答案:

答案 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的两个部分返回重复值,如果他自己在项目中并作为组的一部分,则查询只返回一个结果。