三个表连接第一个和第三个数据

时间:2013-03-20 13:26:14

标签: mysql join

我将三个数据库表(MySQL)简化为以下信息:

===============
member
---------------
id
FirstName
===============

member.id = quote_details.member_id

===============
quote_details
---------------
member_id
insurer_id
===============

quote_details.insurer_id = insurer.id

===============
insurer
---------------
id
Name
===============

我想要输出的是member.FirstNameinsurer.Name,所以我理解我将需要所有表之间的连接 - 即成员> quote_details然后quote_details>保险公司。我正在努力尝试连接类型,并希望有人能指出我正确的方向。

提前感谢您的回复。

此致

尼尔

编辑澄清:

我已尝试过三个INNER JOIN,但会返回所有保险公司的列表,其中包含被查询成员的FirstName:

==========================
FirstName | Insurer
--------------------------
Test      | Insurer One
Test      | Insurer Two
Test      | Insurer Three
==========================

因为我只要求分配给会员报价的实际保险公司。我希望这有助于澄清一些事情。

编辑以添加样本数据:

===================
member
-------------------
id | FirstName
- - - - - - - - - -
 1 | Test
 2 | John
 3 | Jane
===================

=======================
quote_details
-----------------------
member_id | insurer_id
- - - - - - - - - - - -
        1 |          1
=======================

===================
insurer
-------------------
id | Name
- - - - - - - - - -
 1 | Insurer One
 2 | Insurer Two
 3 | Insurer Three
===================

这有望提供现在所有的清晰度:¬)

2 个答案:

答案 0 :(得分:0)

基本上,如果表INNER JOIN中的两列都是不可为空的列,quote_details就足以满足您的需求。

SELECT  b.FirstName MemberName,
        c.Name InsurerName
FROM    quote_details a
        INNER JOIN member b
            ON a.member_ID = b.id
        INNER JOIN insurer c
            ON a.insurer_ID = c.ID

要进一步了解联接,请访问以下链接:

答案 1 :(得分:0)

您的数据设置为允许会员拥有多家保险公司(反之亦然)。如果您希望所有保险公司都在同一行,您需要进行汇总:

select m.FirstName, group_concat(i.Name separator ', ') as Insurers
from member m inner join
     quote_details qd
     ON qd.member_ID = m.id inner join
     insurer i
     ON qd.insurer_ID = i.ID
group by m.FirstName

在给表别名时,使用合理的缩写而不是“a”,“b”,“c”等。合理的缩写使查询更容易理解。

如果您的会员没有保险公司,他们将不会出现在输出中。如果您想要所有这些内容,请使用left outer join

select m.FirstName, group_concat(i.Name separator ', ') as Insurers
from member m left outer join
     quote_details qd
     ON qd.member_ID = m.id left outer join
     insurer i
     ON qd.insurer_ID = i.ID
group by m.FirstName

如果你想要它们在不同的行上:

select m.FirstName, i.Name
from quote_details qd inner join
     member m
     ON qd.member_ID = m.id inner join
     insurer i
     ON qd.insurer_ID = i.ID