MySQL一个表内连接有3个不同的实体表

时间:2012-07-27 04:42:27

标签: mysql inner-join

我有4个表, Email_Company_Contact_Ref 表是与电子邮件,公司和联系人链接的表。

**Email_Company_Contact_Ref**

id = primary key
email_id = reference to Email.`id`
ref_id = it can be Company.id / Contact.id
table = reference from which table name

table structure

我尝试使用左连接来获取输出,但是我得到了重复的结果。如果我尝试内部联接,我将不会得到任何结果,这是因为公司和联系这两个表没有任何共同点。

这是我想要完成的输出。

output result

我能够使用UNION来获取输出,但它并没有真正有效。我认为它应该是一种获得输出结果的方法..请帮忙。

谢谢!

3 个答案:

答案 0 :(得分:1)

我不认为没有UNION就可以做到。这是我的建议。

SELECT email_address, eccr.table table, company_name, contact_name
FROM Email e, Email_Company_Contact_Ref eccr,
     (SELECT "Company" table, id, company_name, NULL contact_name
      FROM Company
      UNION ALL
      SELECT "Contact" table, id, NULL company_name, contact_name
      FROM Contact) cc
WHERE e.id = eccr.email_id
AND eccr.table = cc.table
AND eccr.email_id = cc.id

答案 1 :(得分:1)

这是我的mysql答案,希望这可以帮助

SELECT e.email, r.table, c1.name AS company_name, c2.name AS contact_name
FROM email_company_contact_ref r
JOIN email e ON e.id = r.email_id
LEFT JOIN company c1 ON (c1.id = r.ref_id AND r.table = 'company')
LEFT JOIN contact c2 ON (c2.id = r.ref_id AND r.table = 'contact')
GROUP BY r.table, e.email

答案 2 :(得分:0)

我没有得到ref_id部分......它是外键吗?或者这是Email_Company_Contact_Ref表的主键?

我认为您希望将Email表的引用放在CompanyContact表中。如果您需要多封电子邮件,则应创建两个联接表:Company_EmailContact_Email。您当前的设计(将表名称作为列的值引用)是错误的SQL设计 - 只是因为像RoR这样的东西促进它,它将不会更好。

通过适当的设计,相当于那个复杂的查询看起来像:

CREATE TABLE Company_Email (company_id integer, email_address varchar(100),
  FOREIGN KEY company_id REFERENCES Company (id));

CREATE TABLE Contact_Email (contact_id integer, email_address varchar(100),
  FOREIGN KEY contact_id REFERENCES Contact (id));

SELECT email_address, 'Company' AS kind, company_name AS name
  FROM Company_Email ce JOIN Company c ON company_id = c.id
 UNION
SELECT email_address, 'Contact', contact_name
  FROM Contact_Email ce JOIN Contact c ON contact_id = c.id;

如果你不能改变它,你将不得不按照Barmar解释的那样做UNION。

或者,您可以执行SELECT DISTINCT以删除左连接查询中的重复项。