加入3桌

时间:2011-05-14 11:12:33

标签: mysql join

首先,对不起,如果这是一个足够接近的重复。我找到了this question,它几​​乎可以满足我的需求,但是我无法理解如何根据自己的需要改变它。

我有这三张桌子:

cs_Accounts:

+----+-----------------------------+-------------+
| id | email                       | username    |
+----+-----------------------------+-------------+
| 63 | jamasawaffles@googlil.com   | jamwaffles2 |
| 64 | jamwghghhfles@goomail.com   | 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_lmiitlow_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子句指定的值的情况下才选择行的情况。如您所见,上表仅包含权限表中包含行的用户。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

如果需要,可以在此查询中添加WHERE子句