我有三个不同的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)?
答案 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';