2

4つのテーブルがあります。Email_Company_Contact_Refテーブルは、Email、Company、およびContactにリンクされたテーブルです。

**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のこの2つのテーブルに共通点がないためです。

これが私が完成させたい出力です。

出力結果

UNIONを使用して出力を取得することはできましたが、あまり効果的ではありません。私はそれが出力結果を得る方法であるべきだと思っています。助けてください。

ありがとう!

4

3 に答える 3

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 に答える
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 に答える
0

私はそのref_id部分を取得していません...それは外部キーですか?Email_Company_Contact_Refそれとも、それがテーブルの主キーですか?

Emailテーブルの参照をとテーブルCompanyに入れたいと思いますContact。それらに複数の電子メールが必要な場合は、2つの結合テーブルを作成する必要があります: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 に答える