我有3张桌子分配。第一个表:患者:patid,fname,lname,recordnum。患者:patid,drid,PATIENTCLIN:patid,clinid。
我需要按fname或lname来选择患者,如果在表“ PATIENTDR”中找到表“ PATIENTDR”中的“ PATID”如果DRID =“ $ docotr-> id”或“ PATIENTCLIN”如果CLINID =“ $ clinic-> clinid”
这是我的查询
SELECT t1.* FROM patient t1
WHERE patlname like '{$search_patlname}%'
AND patfname like '{$search_patfname}%'
AND
(
EXISTS
(SELECT patid FROM patientdr t2 WHERE t2.drid = '{$doctor->id}' AND t2.patid = t1.patid)
OR EXISTS
(SELECT patid FROM patientclin t3 WHERE t3.clinid = '{$clinic->clinid}' AND t3.patid = t1.patid)
)
LIMIT 10
患者人数可能非常多,将使用ajax并考虑以下注意事项来检索数据:
“在MySQL中使用EXISTS条件的SQL语句效率很低,因为子查询针对外部查询表中的每一行都是RE-RUN。有许多更有效的方式来编写大多数不使用EXISTS条件的查询。”
有没有一种更有效的方式来编写此查询,也许我应该打破规则,在病人表和病人表中插入病人的fname和lname来减少响应时间,或者将结果限制为10行足够有效?预先感谢您的各种帮助。
如评论中所述,这可以通过简单的INNER JOIN解决:
SELECT t1.*
FROM patient t1
INNER JOIN (
SELECT patid
FROM patientdr t2
WHERE t2.drid = '{$doctor->id}'
UNION DISTINCT
SELECT patid
FROM patientclin t3
WHERE t3.clinid = '{$clinic->clinid}'
) i
ON t1.patid = i.patid
WHERE patlname like '{$search_patlname}%'
AND patfname like '{$search_patfname}%'
LIMIT 10
如果您还没有阅读有关INNER JOIN的文档,那么值得花些时间阅读并处理一些使用它的查询。
祝你好运!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句