2011-05-14 109 views
2

首先,对不起,如果这是一个足够接近的副本。我发现this question,这几乎是我想要的,但我无法围绕如何改变它以满足我的需求。加入3张表

我有这3个表:

 
cs_Accounts: 

+----+-----------------------------+-------------+ 
| id | email      | username | 
+----+-----------------------------+-------------+ 
| 63 | [email protected] | jamwaffles2 | 
| 64 | [email protected] | jamwaffles3 | 
| 65 | dhenddfggdfgetal-pipdfg.com | dhendu9411 | 
| 60 | jwapldfgddfgfffles.co.uk | jamwaffles | 
+----+-----------------------------+-------------+ 

cs_Groups: 

+----+-----------+------------+-------------+ 
| id | low_limit | high_limit | name  | 
+----+-----------+------------+-------------+ 
| 1 |   0 |   0 | admin  | 
| 2 |   1 |   50 | developer | 
| 3 |  76 |  100 | reviewer | 
| 4 |  51 |   75 | beta tester | 
| 5 |   1 |   50 | contributor | 
+----+-----------+------------+-------------+ 

cs_Permissions: 

+----+---------+----------+ 
| id | user_id | group_id | 
+----+---------+----------+ 
| 4 |  60 |  4 | 
| 3 |  60 |  1 | 
| 5 |  60 |  2 | 
| 6 |  62 |  1 | 
| 7 |  62 |  3 | 
+----+---------+----------+ 

我一直在冥思苦想,3路马上加入了几个小时,我无法得到我想要的结果。我正在寻找这样的行为:对于cs_Accounts中的每个用户,将返回一行,其中cs_Permissions中有一行包含其ID和cs_Groups的组的ID,以及group_id的组具有high_lmiit,并且在我可以指定的范围内的low_limit

使用上面的表中的数据,我们可能最终是这样的:

 
email       username  cs_Groups.name 
---------------------------------------------------------- 
jwapldfgddfgfffles.co.uk  jamwaffles admin 
jwapldfgddfgfffles.co.uk  jamwaffles developer 
jwapldfgddfgfffles.co.uk  jamwaffles beta tester 
dhenddfggdfgetal-pipdfg.com dhendu9411 admin 
dhenddfggdfgetal-pipdfg.com dhendu9411 reviewer 

有一个额外的条件,但是。这种情况是只有在用户所属的组具有high_limitlow_limit时才选择行,其中的值可以使用WHERE子句指定。正如你所看到的,上面的表只包含在权限表中有行的用户。

回答

5

这感觉很像家庭作业,但有一个像詹姆斯这样的名字我总是愿意帮忙。

select a.email,a.username,g.name 
from cs_Accounts a 
inner join cs_Permissions p on p.user_id = a.id 
inner join cs_Groups g on g.id = p.Group_id 
where g.low_limit > 70 
and g.high_limt < 120 
+0

这实际上是一个项目,我工作的一部分WHERE条款添加到该查询。我明白为什么这可能是功课,但它不是 - 只是一个非常混乱的问题! – Bojangles 2011-05-14 12:46:02

+0

谢谢你好先生 - 这是一种享受:-)我没有意识到它会像这样简单! – Bojangles 2011-05-14 12:56:37

+0

真棒的答案,适应这种结构,以适应我的查询,它直接工作,直观地说至少!声誉++ :) – cwiggo 2013-11-06 10:52:52

0

这是查询

SELECT ac.email, ac.username, gr.name 
FROM cs_Accounts AS ac 
LEFT JOIN cs_Permissions AS per ON per.user_id = ac.id 
INNER JOIN cs_Groups AS gr ON per.user_id = gr.id 

你可以,如果你想