简体   繁体   English

如何有效地查询两列上的多对多关系

[英]How to efficiently query many-to-many relationship on two columns

I have created these three tables that represent a many-to-many relationship between a doctor and a doctor's specialties. 我创建了这三个表,它们代表了医生与医生专长之间的多对多关系。

A doctor can have many specialties and many doctors can have a certain specialty. 医生可以有很多专长,许多医生可以有一定专长。

CREATE TABLE doctors (
  doctor_id int(11) NOT NULL AUTO_INCREMENT,
  firstname varchar(30) NOT NULL,
  lastname varchar(30) NOT NULL,
  area varchar(50) NOT NULL,
  PRIMARY KEY (doctor_id)
);

CREATE TABLE has_specialty (
  doctor_id int(11) NOT NULL,
  specialty_id int(11) NOT NULL,
  PRIMARY KEY (doctor_id,specialty_id),
  FOREIGN KEY (doctor_id) REFERENCES doctors (doctor_id),
  FOREIGN KEY (specialty_id) REFERENCES specialties (specialty_id)
);

CREATE TABLE IF specialties (
  specialty_id int(11) NOT NULL AUTO_INCREMENT,
  specialty varchar(254) NOT NULL UNIQUE,
  PRIMARY KEY (specialty_id)
);
  • What i want is to find all the doctors that have the specialty 'H' and are in the area 'B'. 我想要的是找到所有具有'H'专业并且在'B'地区的医生。

So for example lets say we have this database: 例如,假设我们有这个数据库:

DOCTORS
+-----------+-----------+----------+----------+
| doctor_id | firstname | lastname | area     |
+-----------+-----------+----------+----------+
|         1 | Virginia  | Clark    | A        |
|         2 | Jane      | Brown    | B        |
|         3 | Adam      | Harris   | D        |
|         4 | Anthony   | Rogers   | D        |
|         5 | Paula     | Lopez    | B        |
|         6 | Jerry     | Howard   | A        |
|         7 | Willie    | Nelson   | C        |
|         8 | Juan      | Perry    | A        |
|         9 | Victor    | Allen    | B        |
+-----------+-----------+----------+----------+

SPECIALTIES
+--------------+-----------+
| specialty_id | specialty |
+--------------+-----------+
| 1            | A         |
| 2            | B         |
| 3            | C         |
| 4            | D         |
| 5            | E         |
| 6            | F         |
| 7            | G         |
| 8            | H         |
| 9            | I         |
+--------------+-----------+

HAS_SPECIALTY
+-----------+--------------+
| doctor_id | specialty_id |
+-----------+--------------+
| 1         | 4            |
| 1         | 6            |
| 1         | 8            |
| 2         | 3            |
| 2         | 8            |
| 3         | 1            |
| 3         | 4            |
| 3         | 5            |
| 4         | 4            |
| 5         | 8            |
| 5         | 9            |
| 6         | 2            |
| 6         | 7            |
| 7         | 9            |
| 8         | 4            |
| 9         | 2            |
| 9         | 3            |
+-----------+--------------+

The result should be: 结果应为:

+-----------+-----------+----------+----------+
| doctor_id | firstname | lastname | area     |
+-----------+-----------+----------+----------+
|         2 | Jane      | Brown    | B        |
|         5 | Paula     | Lopez    | B        |
+-----------+-----------+----------+----------+

You can do that with simple INNER JOIN 's: 您可以使用简单的INNER JOIN来做到这一点:

SELECT d.doctor_id, d.firstname,d.lastname,d.area     
FROM doctors d
INNER JOIN has_specialty hs ON d.doctor_id = hs.doctor_id
INNER JOIN specialties s ON hs.specialty_id = s.specialty_id
WHERE s.specialty = 'H' AND d.area = 'B';

sqlfiddle demo sqlfiddle演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM