mysql使用左连接限制不能正常工作

时间:2016-10-31 15:39:18

标签: mysql

我有两张看起来像这样的表

患者(表1)

id |  name 
------------
1  | robel  
2  | dave

Patient_followup (表2)

 id | Patient_id | date_created
 -----------------------
 1  | ---- 1  -- | 01/01/2015     
 2  | -----1  -- | 01/07/2016

我希望向所有患者展示他们最新的后续数据。所以我尝试使用这个查询

Select * from patient 
left join Patient_followup pf on pf.Patient_id = patient.id
order by pf.date_created
Limit 1

但这只给了我第一个病人。我试图删除限制,它给我两个robel记录和一个dave记录,因为robel有两个后续数据。那么我该怎么办才能得到每位病人的一份记录?

3 个答案:

答案 0 :(得分:1)

试试这个:

Select 
    * 
from 
    patient 
left join 
    (SELECT
        id as pf_id, 
        MAX(date_created) as latest_followup_date, 
        Patient_id
     FROM 
        Patient_followup 
     GROUP BY 
        Patient_id) as pf
ON pf.Patient_id = patient.id

答案 1 :(得分:1)

1)“限制1”仅返回第一个结果。通常,如果查询将导致非常大的结果集并且您只想要前几个结果,则使用此方法。

例如:

"LIMIT 30" will show the first 30 rows of the query.

2)我将更改为表的设置,以便查询更顺畅。现在,即使患者已经创建,您也会为每个后续日期创建一个新行。您可以在名为“FollowUpDate”的表中添加另一列。这样,每个患者记录在同一行中具有表ID,患者ID,创建日期和后续日期。这样,每个病人只有一排。

EX:

Patient (table 1)

id |  name  | created_date | next_followup_date |

 1 |  Robel |  01/01/2015  |     01/01/2016     |
 2 |  Dave  |[created_date]| [next_follup_date] |


Patient_followup (table 2)

id | Patient_id | date_created |  followUpDate  |

1 |       1     |  01/01/2015  |   06/01/2016   | // example date
2 |       1     |  01/01/2015  |   01/01/2016   |
3 |       2     |[date created]| [FollowUpDate] |

3)将查询更改为:

使用此select语句获取所有患者记录。

Select * from patient 
left join Patient_followup pf on pf.Patient_id = patient.id
order by pf.Patient_id

使用此select语句获取特定的患者记录信息。

Select * from patient 
inner join Patient_followup pf on pf.Patient_id = patient.id
where patient.id = 1 //to get robel. Edit this line as necessary, perhaps by user input...
order by pf.followUpDate

注意:在Patient_followup中插入新记录时,请确保更新Patient.next_followup_date。

我希望这有帮助!

答案 2 :(得分:1)

如第一条评论中的 anton 所述,您需要使用聚合来为每位患者获取一条记录。

Select patient.*,MAX(pf.date_created) as followupdate,group_concat(pf.date_created) from patient 
 left join Patient_followup pf on pf.Patient_id = p.patient.id
group by patient.id
order by pf.date_created

在这里,您将以逗号分隔您的值。