Mysql 筛选两个表之间联接的结果

Mysql 筛选两个表之间联接的结果,mysql,sql,Mysql,Sql,我甚至不知道如何命名这个问题,或者如何寻找类似的问题来实现我的目标 我正在处理两张桌子。第一个表包含其他两个表之间的关系 表doc_公司 idDoc idCompany contact 1 2 1 1 5 1 1 6 1 1 6 3 id name1 email1 name2 emai

我甚至不知道如何命名这个问题,或者如何寻找类似的问题来实现我的目标

我正在处理两张桌子。第一个表包含其他两个表之间的关系

表doc_公司

idDoc   idCompany   contact
  1         2          1
  1         5          1
  1         6          1
  1         6          3
id      name1       email1          name2       email2          name3       email3
2       John        john@mail.com   Jack        jack@mail.com   Jane        jane@mail.com
5       Susan       susan@mail.com  Pete        pete@mail.com   Mary        mary@mail.com
6       Lily        lily@mail.com   Bob         bob@mail.com    Tom         tom@mail.com
idDoc是一个文档的id,该文档将发送给位于不同公司的不同联系人。让我困惑的是,idCompany和contact字段在同一个表中

这是我们公司的桌子

id      name1       email1          name2       email2          name3       email3
2       John        john@mail.com   Jack        jack@mail.com   Jane        jane@mail.com
5       Susan       susan@mail.com  Pete        pete@mail.com   Mary        mary@mail.com
6       Lily        lily@mail.com   Bob         bob@mail.com    Tom         tom@mail.com
所以我需要从contacts列中获取数字,然后从contacts列中获取数据 使用类似“姓名”+联系人的表格公司

考虑到第一张表。如果idDoc=1,这就是我希望通过查询得到的结果

name        email
John        john@mail.com
Susan       susan@mail.com
Lily        lily@mail.com
Tom         tom@mail.com
我不知道如何从这样的问题开始。我的第一个想法是表之间的内部连接,我想到了这个:

SELECT companies.name1, companies.email1, companies.name2, companies.email2, companies.name3, companies.email.3
FROM companies
INNER JOIN doc_company
ON companies.id = doc_companies.idCompany
WHERE doc_companies.idDoc = 1
但这将返回所有联系人和六列


我怎样才能得到我需要的结果?是否可以使用子查询?

考虑使用外部
过滤器的派生表中的
联合
查询:

SELECT t.*
FROM
   (SELECT d.idDoc, c.name1 as `name`, c.email1 as `email`
    FROM companies c
    INNER JOIN doc_company d
           ON c.id = d.idCompany
    UNION 
    SELECT d.idDoc, c.name2, c.email2 
    FROM companies c
    INNER JOIN doc_company d
           ON c.id = d.idCompany
    UNION
    SELECT d.idDoc, c.name3, c.email3
    FROM companies c
    INNER JOIN doc_company d
           ON c.id = d.idCompany
    ) t
WHERE t.idDoc = 1

是的,与主管就数据库设计进行讨论,因为您可以看到查询和存储更复杂,效率更低,可扩展性也更低。

考虑使用外部
过滤器的派生表中的
联合
查询:

SELECT t.*
FROM
   (SELECT d.idDoc, c.name1 as `name`, c.email1 as `email`
    FROM companies c
    INNER JOIN doc_company d
           ON c.id = d.idCompany
    UNION 
    SELECT d.idDoc, c.name2, c.email2 
    FROM companies c
    INNER JOIN doc_company d
           ON c.id = d.idCompany
    UNION
    SELECT d.idDoc, c.name3, c.email3
    FROM companies c
    INNER JOIN doc_company d
           ON c.id = d.idCompany
    ) t
WHERE t.idDoc = 1

是的,就数据库设计与主管进行讨论,因为您可以看到查询和存储更复杂、效率更低、可扩展性更低。

看起来您的
公司的
表需要进行原子化/标准化。@Terry我是这么想的,但我需要知道是否有办法使其正常工作。如果不可能的话,我会通知我的主管数据库需要更改。看起来您的
公司
表需要原子化/标准化。@Terry我是这么想的,但我需要知道是否有办法让它正常工作。如果不可能,我会通知我的主管数据库需要更改。出于某种原因,它会在结果表中添加一个空行。我决定用另一个答案,因为它比较短,但我真的很感谢你的帮助。出于某种原因,它在结果表中添加了一个空行。我决定用另一个答案,因为它比较短,但我真的很感谢你的帮助。