连接 3 个表

Posted

技术标签:

【中文标题】连接 3 个表【英文标题】:Joining 3 tables 【发布时间】:2011-05-14 11:12:32 【问题描述】:

首先,对不起,如果这是一个足够接近的副本。我找到了this question,它几乎可以满足我的需求,但我不知道如何根据需要对其进行更改。

我有这 3 张桌子:

cs_Accounts: +----+------------------+-------------+ |编号 |电子邮件 |用户名 | +----+------------------+-------------+ | 63 | jamasawaffles@googgil.com |果酱2 | | 64 | jamwghghfles@goomail.com |果酱3 | | 65 | dhenddfggdfgetal-pipdfg.com | dhendu9411 | | 60 | jwapldfgddfgfffles.co.uk |果酱| +----+------------------+-------------+ cs_Groups: +----+------------+------------+-------------+ |编号 |低限 |高限 |姓名 | +----+------------+------------+-------------+ | 1 | 0 | 0 |管理员 | | 2 | 1 | 50 |开发商 | | 3 | 76 | 100 |审稿人 | | 4 | 51 | 75 |测试者 | | 5 | 1 | 50 |贡献者 | +----+------------+------------+-------------+ cs_Permissions: +----+---------+----------+ |编号 |用户 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

使用上表中的数据,我们可能会得到如下结果:

电子邮件用户名 cs_Groups.name -------------------------------------------------- -------- jwapldfgddfgfffles.co.uk jamwaffles 管理员 jwapldfgddfgfffles.co.uk jamwaffles 开发商 jwapldfgddfgfffles.co.uk jamwaffles beta 测试器 dhenddfggdfgetal-pipdfg.com dhendu9411 管理员 dhenddfggdfgetal-pipdfg.com dhendu9411 审稿人

但是,还有一个额外的条件。这种情况下,仅当用户所属的组具有 high_limitlow_limit 且我可以使用 WHERE 子句指定的值时才选择行。如您所见,上表仅包含权限表中具有行的用户。

【问题讨论】:

【参考方案1】:

这感觉很像家庭作业,但像詹姆斯这样的名字我总是愿意提供帮助。

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

【讨论】:

这实际上是我正在进行的一个项目的一部分。我明白为什么这可能是家庭作业,但它不是 - 只是一个非常令人困惑的问题! 谢谢你的好先生 - 这是一种享受 :-) 我没有意识到它会这么简单! 很棒的答案,调整了这个结构以适应我的查询,它直接工作,至少可以说直观!声誉++ :)【参考方案2】:

这是查询

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 子句

【讨论】:

以上是关于连接 3 个表的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 命名查询 - 连接 3 个表

Laravel 连接 3 个表

3个表的内部连接给出重复的结果

连接来自两个不同数据库的 3 个表?

MongoDB中的3个表连接

使用 ecto 查询连接 3 个表