問題
People、Phones、Emails の 3 つのテーブルがあります。各人は一意の ID を持ち、各人は複数の番号または複数の電子メールを持つことができます。
簡略化すると、次のようになります。
+---------+----------+
| ID | Name |
+---------+----------+
| 5000003 | Amy |
| 5000004 | George |
| 5000005 | John |
| 5000008 | Steven |
| 8000009 | Ashley |
+---------+----------+
+---------+-----------------+
| ID | Number |
+---------+-----------------+
| 5000005 | 5551234 |
| 5000005 | 5154324 |
| 5000008 | 2487312 |
| 8000009 | 7134584 |
| 5000008 | 8451384 |
+---------+-----------------+
+---------+------------------------------+
| ID | Email |
+---------+------------------------------+
| 5000005 | Smithley@goodmail.com.com |
| 5000005 | Smithley.j@gmail.com |
| 5000008 | Smithley@gmail.com |
| 5000008 | tech@goodmail.com |
| 5000008 | feler@campus.uni.com |
| 8000009 | Ashley.hill86@gmail.com |
| 5000004 | georgestanko@hotmail.com |
+---------+------------------------------+
重複することなくそれらを結合しようとしています。People とのメールのみ、または People との電話のみに参加しようとすると、うまく機能します。
SELECT People.Name, People.ID, Phones.Number
FROM People
LEFT OUTER JOIN Phones ON People.ID=Phones.ID
ORDER BY Name, ID, Number;
+----------+---------+-----------------+
| Name | ID | Number |
+----------+---------+-----------------+
| Steven | 5000008 | 8451384 |
| Steven | 5000008 | 24887312 |
| John | 5000005 | 5551234 |
| John | 5000005 | 5154324 |
| George | 5000004 | NULL |
| Ashley | 8000009 | 7134584 |
| Amy | 5000003 | NULL |
+----------+---------+-----------------+
SELECT People.Name, People.ID, Emails.Email
FROM People
LEFT OUTER JOIN Emails ON People.ID=Emails.ID
ORDER BY Name, ID, Email;
+----------+---------+------------------------------+
| Name | ID | Email |
+----------+---------+------------------------------+
| Steven | 5000008 | Smithley@gmail.com |
| Steven | 5000008 | tech@goodmail.com |
| Steven | 5000008 | feler@campus.uni.com |
| John | 5000005 | Smithley@goodmail.com.com |
| John | 5000005 | Smithley.j@gmail.com |
| George | 5000004 | georgestanko@hotmail.com |
| Ashley | 8000009 | Ashley.hill86@gmail.com |
| Amy | 5000003 | NULL |
+----------+---------+------------------------------+
ただし、People でメールと電話に参加しようとすると、次のようになります。
SELECT People.Name, People.ID, Phones.Number, Emails.Email
FROM People
LEFT OUTER JOIN Phones ON People.ID = Phones.ID
LEFT OUTER JOIN Emails ON People.ID = Emails.ID
ORDER BY Name, ID, Number, Email;
+----------+---------+-----------------+------------------------------+
| Name | ID | Number | Email |
+----------+---------+-----------------+------------------------------+
| Steven | 5000008 | 8451384 | feler@campus.uni.com |
| Steven | 5000008 | 8451384 | Smithley@gmail.com |
| Steven | 5000008 | 8451384 | tech@goodmail.com |
| Steven | 5000008 | 24887312 | feler@campus.uni.com |
| Steven | 5000008 | 24887312 | Smithley@gmail.com |
| Steven | 5000008 | 24887312 | tech@goodmail.com |
| John | 5000005 | 5551234 | Smithley@goodmail.com |
| John | 5000005 | 5551234 | Smithley.j@gmail.com |
| John | 5000005 | 5154324 | Smithley@goodmail.com |
| John | 5000005 | 5154324 | Smithley.j@gmail.com |
| George | 5000004 | NULL | georgestanko@hotmail.com |
| Ashley | 8000009 | 7134584 | Ashley.hill86@gmail.com |
| Amy | 5000003 | NULL | NULL |
+----------+---------+-----------------+------------------------------+
何が起こるか - Person が 2 つの番号を持っている場合、彼のすべてのメールが 2 回表示されます (並べ替えることができません!つまり、@last で削除することはできません)。
私が欲しいもの:
要するに、@last で遊んで、このようなものになりたいのですが、ORDER 列を正しい方法で配置しないと @last は機能しません。これは大きな問題のように思えます。メール欄。上記の例からわかるように:
スティーブンは 2 つの電話番号と 3 つの電子メールを持っています。数値を使用した JOIN 電子メールは各電子メールで発生するため、ソートできない重複値 (SORT BY は機能しません)。
**THIS IS WHAT I WANT**
+----------+---------+-----------------+------------------------------+
| Name | ID | Number | Email |
+----------+---------+-----------------+------------------------------+
| Steven | 5000008 | 8451384 | feler@campus.uni.com |
| | | 24887312 | Smithley@gmail.com |
| | | | tech@goodmail.com |
| John | 5000005 | 5551234 | Smithley@goodmail.com |
| | | 5154324 | Smithley.j@gmail.com |
| George | 5000004 | NULL | georgestanko@hotmail.com |
| Ashley | 8000009 | 7134584 | Ashley.hill86@gmail.com |
| Amy | 5000003 | NULL | NULL |
+----------+---------+-----------------+------------------------------+
多くの電子メールがある可能性があるため、電子メールと番号を別々の表に保持するのが最善であると言われました。それで、それがとても一般的なことなら、簡単な解決策がないのは何ですか?
PHPソリューションにも満足しています。
私が今までに知っていることは、それを満足させますが、それほどきれいではありません.
GROUP_CONTACT でそれを行うと、満足のいく結果が得られますが、見栄えがよくありません。「Email type = work」をその隣に置くことはできません。
SELECT People.Ime,
GROUP_CONCAT(DISTINCT Phones.Number),
GROUP_CONCAT(DISTINCT Emails.Email)
FROM People
LEFT OUTER JOIN Phones ON People.ID=Phones.ID
LEFT OUTER JOIN Emails ON People.ID=Emails.ID
GROUP BY Name;
+----------+----------------------------------------------+---------------------------------------------------------------------+
| Name | GROUP_CONCAT(DISTINCT Phones.Number) | GROUP_CONCAT(DISTINCT Emails.Email) |
+----------+----------------------------------------------+---------------------------------------------------------------------+
| Steven | 8451384,24887312 | Smithley@gmail.com,tech@goodmail.com,feler@campus.uni.com |
| John | 5551234,5154324 | Smithley@goodmail.com,Smithley.j@gmail.com |
| George | NULL | georgestanko@hotmail.com |
| Ashley | 7134584 | Ashley.hill86@gmail.com |
| Amy | NULL | NULL |
+----------+----------------------------------------------+---------------------------------------------------------------------+