从多对多关系的一方查询价值观?

时间:2014-12-17 13:24:52

标签: mysql sql select join inner-join

我有三个不同的MySQL表:

医生:

| id | name  |
+----+-------+
| 1  | john  |
| 2  | maria |
| 3  | ann   |

诊:

| id | location |
+----+----------+
| 1  | New York |
| 2  | Chicago  |
| 3  | LA       |

doctor_clinic:

| doctor_id | clinic_id |
+-----------+-----------+
|     1     |     2     |
|     1     |     3     |
|     2     |     1     |
|     3     |     1     |
|     3     |     3     |

表doctor_clinic是一个关系表。

如何查询洛杉矶的所有医生(id = 3)?

3 个答案:

答案 0 :(得分:1)

正如你现在所学到的那样,你需要一个内在的联接才能做到这一点,但是如果你对这个问题感到困惑,我认为花时间去理解这个问题是很重要的。发生在这里。

交叉表并不仅仅是将诊所与医生联系起来,而是创建了many to many关系。换句话说,一个医生可以属于许多诊所,一个诊所可以有许多医生。这在现实世界的应用程序中是有意义的,重要的是要考虑这些真实世界模型以帮助理解您的问题。

所以,在我解释编写查询之前,让我们考虑一下这里要做什么:

  

如何查询洛杉矶的所有医生(id = 3)?

很明显,仅仅是临床表是不够的,而且我们知道诊所通过doctor_clinic表与医生联系,所以我们需要加入。联接的简要语法说明是:

SELECT *
FROM table1
JOIN table2 ON table1.relatedColumn = table2.relatedColumn

首先通过将其与诊所表联系起来,从doctor_clinic表中获取所有医生ID,如下所示:

SELECT dc.doctor_id
FROM doctor_clinic dc
JOIN clinic c ON c.id = dc.clinic_id

如果你需要的只是医生的ids,那就足够了。然而,要获得医生的名字,我们需要加入医生表。使用doctor_id和id列将医生表连接到doctor_clinic:

SELECT d.name
FROM doctor d
JOIN doctor_clinic dc ON d.id = dc.doctor_id
JOIN clinic c ON c.id = dc.clinic_id
WHERE c.id = 3;

您可以在where子句中添加诊所ID 3的条件。如果您不知道它是id 3,只需将该行更改为WHERE c.location = 'LA'即可。我希望这有助于向您解释问题。

以下是SQL Fiddle示例。

答案 1 :(得分:0)

您可以使用内部联接:

select d.* from 
Doctors d inner join doctor_clinic dc = on d.DOctorId = dc.DoctorId
inner join Clinics c on c.ClinicId = dc.ClinicID
where c.ClinicId = 3

答案 2 :(得分:0)

使用简单的 JOIN 来获取结果:

试试这个:

SELECT D.id, D.name
FROM Doctors D 
INNER JOIN doctor_clinic DC ON D.id = DC.doctorId 
INNER JOIN Clinics C ON C.id = DC.clinicId 
WHERE C.name = 'LA';