【问题标题】:Querying values from one side of a many-to-many relationship?从多对多关系的一侧查询值?
【发布时间】:2014-12-17 13:24:52
【问题描述】:

我有三个不同的 MySQL 表:

医生:

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

诊所:

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

医生诊所:

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

表医生_诊所是一个关系表。

如何查询 LA (id=3) 的所有医生?

【问题讨论】:

  • 这个问题非常非常基础。您真的应该先阅读 sql 教程。
  • 既然已经回答了这个问题,我想快速发送一个resource,这可能会有所帮助。

标签: mysql sql select join inner-join


【解决方案1】:

正如您现在所了解的,您需要一个内部连接来执行此操作,但如果您对这个问题感到困惑,我认为花时间了解这里发生的事情很重要。

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

所以,在我解释编写查询之前,让我们想想这里必须做什么:

如何查询 LA (id=3) 的所有医生?

很明显,仅仅clinic表是不够的,而且我们知道clinics是通过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

如果您只需要医生的身份证,那么这就足够了。然而,为了得到医生的名字,我们需要加入医生表。医生表使用医生 ID 和 ID 列连接到医生诊所:

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 示例。

【讨论】:

    【解决方案2】:

    您可以为此使用内部联接:

    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
    

    【讨论】:

      【解决方案3】:

      使用简单的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';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-18
        • 1970-01-01
        • 2020-05-15
        • 2021-08-07
        • 2012-06-12
        • 2019-02-02
        • 2014-07-14
        相关资源
        最近更新 更多