我甚至不确定如何标题这个问题,或者如何为我想要达到的目标寻找类似的问题。
我正在使用两张桌子。第一个包含2个其他表之间的关系。
表doc_companies
idDoc idCompany contact
1 2 1
1 5 1
1 6 1
1 6 3
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列中获取数字,然后从中获取数据 表公司使用“名称”+联系
之类的东西所以考虑第一张桌子。如果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
但这会返回所有联系人和六列。
如何获得我需要的结果?也许使用子查询?
答案 0 :(得分:2)
[Illuminate\Database\QueryException]
SQLSTATE[42S01]: Base table or view already exists:
答案 1 :(得分:1)
在带有外部UNION
过滤器的派生表中考虑WHERE
查询:
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
是的,请与主管讨论数据库设计,因为您可以看到查询和存储更复杂,效率更低,可扩展性更低。