2016-11-14 81 views
2

我在我的数据库中有三张桌子,一张是病人,一张是他们的温度,另一张桌上是病人的身份证和温度的ID作为主键。如何通过mysql检索所有患者的温度信息?

病人表;

+----+------+--------+------------+ 
| id | name | gender | birth  | 
+----+------+--------+------------+ 
| 1 | Hind | F  | 2015-01-01 | 
| 2 | Saad | M  | 2016-01-01 | 
+----+------+--------+------------+ 

patient_info表:

+------+------+ 
| id_t | id_p | 
+------+------+ 
| 1 | 1 | 
| 1 | 2 | 
| 2 | 3 | 
| 2 | 4 | 
+------+------+ 

下表:

+----+-------------+ 
| id | temperature | 
+----+-------------+ 
| 1 |  37.9 | 
| 2 |   37 | 
| 3 |   38 | 
| 4 |  38.4 | 
+----+-------------+ 

所以,我想要的是检索所有患者的温度,这里是我做了什么:

mysql> SELECT p.*, t.* FROM patient p INNER JOIN patient_info pi ON pi.id_p = p.id INNER JOIN temperature t ON t.id = pi.id_t; 
+----+------+--------+------------+----+-------------+ 
| id | name | gender | birth  | id | temperature | 
+----+------+--------+------------+----+-------------+ 
| 1 | Hind | F  | 2015-01-01 | 1 |  37.9 | 
| 2 | Saad | M  | 2016-01-01 | 1 |  37.9 | 
+----+------+--------+------------+----+-------------+ 

但tha t不是我想要的,我需要知道所有Hind和Saad的温度 谢谢全部

+2

我认为你的ID是在你的Patient_Info表上,或者你的示例数据是坏的。您向我们展示了两位ID为“1”和“2”的患者,但您的Patients_Info表(字段id_p)中有4位患者。您无法在患者3和4上显示临时信息,因为患者表中不存在这些信息。 – JNevill

+0

是的。这里只有两个病人,每个病人都有一个温度读数(两个读数都相同) - 虽然为什么温度有它自己的表格超出了我! – Strawberry

+0

@JNevill你是对的,我的错误,谢谢:) –

回答

1

我希望你真的能够像这样 - 尽管将温度存储在单独的表格中并没有什么意义。 ..

DROP TABLE IF EXISTS patient; 

CREATE TABLE patient 
(patient_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,name VARCHAR(12) NOT NULL 
,gender CHAR(1) NOT NULL 
,dob DATE NOT NULL 
); 

INSERT INTO patient VALUES 
(101 ,'Hind','F','2015-01-01'), 
(102 ,'Saad','M','2016-01-01'); 


DROP TABLE IF EXISTS patient_temperature; 

CREATE TABLE patient_temperature 
(patient_id INT NOT NULL 
,temperature_id INT NOT NULL 
,PRIMARY KEY(patient_id,temperature_id) 
); 

INSERT INTO patient_temperature VALUES 
(101,1), 
(101,2), 
(102,3), 
(102,4); 

DROP TABLE IF EXISTS temperature; 

CREATE TABLE temperature 
(temperature_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,temperature DECIMAL(5,2) NOT NULL 
); 

INSERT INTO temperature VALUES 
(1,37.9), 
(2,37), 
(3,38), 
(4,38.4); 

SELECT p.* 
    , t.* 
    FROM patient p 
    JOIN patient_temperature pt 
    ON pt.patient_id = p.patient_id 
    JOIN temperature t 
    ON t.temperature_id = pt.temperature_id; 
+------------+------+--------+------------+----------------+-------------+ 
| patient_id | name | gender | dob  | temperature_id | temperature | 
+------------+------+--------+------------+----------------+-------------+ 
|  101 | Hind | F  | 2015-01-01 |    1 |  37.90 | 
|  101 | Hind | F  | 2015-01-01 |    2 |  37.00 | 
|  102 | Saad | M  | 2016-01-01 |    3 |  38.00 | 
|  102 | Saad | M  | 2016-01-01 |    4 |  38.40 | 
+------------+------+--------+------------+----------------+-------------+ 
+0

“把温度存储在一个单独的表格中并没有什么意义” - 实际上,在医疗系统中有数据字典有效值的例如挑选清单是一种常见的UX范例。当你考虑这个问题时,一个人有效温度的基数很小。从实际的角度来看,大多数SQL产品/编码器在约束条件方面表现不佳,但外键是例外......这说明,您已经省略了架构的FKs :) – onedaywhen

+0

...也许没有意义的是记录一个温度,而不参考日期/时间或事件。 – onedaywhen