2013-11-24 45 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

看起来像是有效的。非常感谢! :) –