2

我有 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

表结构

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

这是我想要完成的输出。

输出结果

我可以使用 UNION 来获取输出,但它并不是很有效。我认为这应该是一种获得输出结果的方法。请帮忙。

谢谢!

4

3 回答 3

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
于 2012-07-27T14:21:32.607 回答
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
于 2012-07-27T07:19:57.537 回答
0

我没有得到ref_id零件...它是外键吗?或者那是Email_Company_Contact_Ref表的主键?

我认为您希望将表格的参考放在EmailCompany表格Contact中。如果您需要为他们发送多个电子邮件,那么您应该创建两个连接表: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从左连接查询中删除重复项。

于 2012-07-27T07:38:37.360 回答