私には3つのテーブルがあり、それぞれに外部キーがあります。結合を実行すると、列が重複します。
与えられた
mysql> describe Family;
+---------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| HEAD_name | varchar(45) | NO | PRI | | |
| Family_Size | int(11) | NO | | | |
| Gender | char(1) | NO | | | |
| ID_Number | int(11) | NO | | | |
| DOB | date | NO | | | |
| Supervisor_ID | int(11) | NO | MUL | | |
+---------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql> describe SUPERVISOR;
+-------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+---------------+------+-----+---------+-------+
| Supervisor_ID | int(11) | NO | PRI | | |
| Supervisor_Name | varchar(45) | NO | | | |
| Supervisor_Number | decimal(10,0) | NO | | | |
| Center_ID | int(11) | NO | MUL | | |
+-------------------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> describe CENTER;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| Center_ID | int(11) | NO | PRI | | |
| Location | varchar(45) | NO | | | |
+-----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
私のクエリステートメント:
SELECT * from Family
JOIN SUPERVISOR on ( Family.Supervisor_ID = SUPERVISOR.Supervisor_ID)
JOIN CENTER on (SUPERVISOR.Center_ID = CENTER.Center_ID);
私の目的は、重複する列なしで、結合からすべての列の1つの行を取得することです。では、使用すべきSQLステートメントの構文は何ですか?
デフォルトでは、*
を使用すると、MySQLはすべてのテーブルのすべての列を返します。クエリに列名を明示的に入力して、希望する方法で列名を取得する必要があります。次のようにクエリを使用します。
SELECT A.HEAD_name, A.Family_Size, A.Gender, A.ID_Number, A.DOB,
B.Supervisor_ID, B.Supervisor_Name, B.Supervisor_Number,
C.Center_ID, C.Location
FROM Family A
JOIN SUPERVISOR B on ( A.Supervisor_ID = B.Supervisor_ID)
JOIN CENTER C on (B.Center_ID = C.Center_ID);
この問題は、「USING」キーワードで解決できます。
SELECT * from Family
JOIN SUPERVISOR on ( Family.Supervisor_ID = SUPERVISOR.Supervisor_ID)
JOIN CENTER on (SUPERVISOR.Center_ID = CENTER.Center_ID);
あなたの場合、クエリは次のようになります
SELECT * FROM FAMILY
JOIN (SUPERVISOR JOIN CENTER USING(Center_ID)) USING(Supervisor_ID);
ポイントは単純です。2つのテーブルA(a、b)とB(b、c)がある場合、結合した後、(a、b、c)の形式で結果を生成します。
Select *
from A JOIN B USING(b);
3つの列(a、b、c)を持つ結果セットを提供します
注:Usingで複数のパラメーターを使用できるかどうかわからないため、サブクエリとして作成しました。
重複する列は取得されていません。実際に取得されているのは、テーブルFamilyのSupervisor_ID列(Family.Supervisor_ID)とテーブルSupervisorのSupervisor_ID(Supervisor.Supervisor_ID)ですが、結果セットには両方がSupervisor_IDとして表示されます。 、そしてそれがあなたがそれらが複製されていると思う理由です。 Center_iDでも同じことが起こります。
解決策は、各テーブルから必要なフィールドを指定し、Supervisor_IDとCenter_IDを取得する必要があるかどうか、およびどのテーブルから取得するかを決定することです。
Oreillyによると、
Explain Planを探します。
y内部結合から_selectxを実行できます...ここでw = z ...これは単なる例です