2011-10-18 45 views
0

我有一个相当复杂的查询(嗯,我认为无论如何!)来编写。它将包含很多连接。SQL:在查询时遇到问题

这里的想法是:任务链接到项目,项目链接到上下文。用户可以创建一个任务,他们将拥有该任务。但是,用户可以创建团队并与该团队共享项目。因此,作为该团队成员的任何人都可以看到该项目,这是任务。

我想要查询1)属于当前用户当前上下文的任务列表。和2)用户可以通过团队链接到项目来看到结果。

我想显示它所属的任务标题和项目名称。

加入团队时,用户指定哪个上下文将包含该团队的项目。这个想法是背景分解了项目。

以下是涉及的表格。 Users_teams和projects_teams用作链接表,将用户加入到团队和项目中。

users 
----------------- 
id 

tasks 
------------------ 
id | user_id | project_id | title 

projects 
------------------ 
id | name | user_id | context_id 

teams 
------------------ 
id | name | user_id 

users_teams 
------------------ 
id | user_id | team_id | context_id 

projects_teams 
------------------ 
id | project_id | team_id 

我的第一个想法是创建2个单独的查询;一个获取用户拥有的任务列表,另一个获取用户链接到的任务列表。问题是,这样我就无法正确地排序,而且我的查询无论如何给出了奇怪的结果。我想也许有一种方法可以在一个查询中完成这一切?

我第一次查询,简直是:

SELECT * FROM tasks 
JOIN projects on tasks.project_id = projects.id 
WHERE tasks.user_id = 2 AND projects.context_id = 5 

我想第二个将涉及加盟users_teams,projects_teams表。

+0

我还没有想出你想要展示的东西! :S – JellyBelly

+0

1)你可以上传一个带有结构和一些测试数据的sql文件吗? 2)你有什么要求吗?我看到它使用子查询完成(但可能不需要) – mishu

+0

@ JellyBelly我想显示它所属的任务标题和项目名称,用于所有用户拥有的任务并链接到 – iamjonesy

回答

2

什么下列查询:

SELECT 
    z.* 
FROM (
    SELECT 
    t1.* 
    FROM 
    tasks as t1 
    JOIN projects as p1 ON t1.project_id = p1.id 
    WHERE 
    t1.user_id = $userId 
    AND p1.context_id = $contextId 

    UNION 

    SELECT 
    t2.* 
    FROM 
    user_teams as utm 
    JOIN teams as tm ON utm.team_id = tm.id 
    JOIN project_teams as ptm ON tm.id = ptm.team_id 
    JOIN projects as p2 ON ptm.project_id = p2.id 
    JOIN tasks as t2 ON p2.id = t2.project_id 
    WHERE 
    utm.user_id = $userId 
    AND p2.context_id = $contextId 
) as z 
ORDER BY 4 ASC 

查询仅仅是需要两个查询的并集检索您指定的单独数据。然后订购这个工会。

查询包含变量$ userId和$ contextId。

ORDER BY 4 ASC语句按结果集中的第4列排序,在本例中为任务表中的标题列。

+0

如果您有测试数据,我可以测试查询,但自己设置一些测试数据的工作太多。选择你想要的字段很简单,只需将它们添加到联合中的两个选择语句中,但是请注意,两个选择语句应该选择相同的字段。而且您还需要更新订单条款。 –

+0

我试过你的查询,但我得到'每个派生表必须有它自己的别名'。我已经检查了tripple,并且每个表的引用后跟一个别名:( – iamjonesy

+0

)声音就像OP使用的是不同的SQL产品。每个派生表必须有一个相关名称是标准SQL-92要求(尽管在这个查询中没有意义),并且问题只有'sql'标记,我建议你添加一个。 – onedaywhen

0

艰难的部分是加入任务。只要做一个OR条件在ON子句中

INNER JOIN tasks t 
ON p.id = t.projectid 
or u.id = t.user_id 

完整的SQL子句

SELECT 
    p.name, 
    t.title 
FROM 
    users u 
    INNER JOIN users_teams ut 
    on u.id = ut.user_id 
    INNER JOIN projects_teams pt 
    ON ut.team_id = pt.project_id 
    INNER JOIN project p 
    ON project_id = p.id 
    INNER JOIN tasks t 
    ON p.id = t.projectid 
    or u.id = t.user_id 
+0

这看起来很棒康拉德,我会尽快尝试! – iamjonesy