我有两张看起来像这样的表
患者(表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有两个后续数据。那么我该怎么办才能得到每位病人的一份记录?
答案 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
在这里,您将以逗号分隔您的值。