我有3张表。 第一张表: 患者:patid,fname,lname,recordnum。 PATIENTDR:patid,drid, PATIENTCLIN:patid,clinid。
我需要通过fname或lname选择患者,如果" PATID"在表格"患者"见表#34; PATIENTDR"如果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条件。"
是否有更有效的方法来编写此查询,也许我应该破坏规则并在Patientdr和patientclin表中插入患者fname和lname以减少响应时间,或者将结果限制为10行是否足够有效? 感谢您提前提供各种帮助。
答案 0 :(得分:1)
如评论中所述,这可以通过简单的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的文档,那么值得花时间这样做,并且可以使用一些使用它的查询。
祝你好运!