我有3个表在分配。第一个表:病人:病人,姓名,姓名,病历。病人:是的,是的。patientclinin: patid, clinid.
我需要通过fname或lname来选择患者,如果表"PATIENT"中的"PATID"在表"PATIENTDR"中找到,如果DRID="$ doctor ->id"或如果CLINID="$clinic-> CLINID",则"patientclinin"
这是我的查询
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语句效率非常低,因为子查询对外部查询表中的每一行都要重新运行。有更有效的方法来编写大多数查询,而不使用EXISTS条件。"
是否有更有效的方法来编写这个查询,也许我应该打破规则,在表patientdr和patientclin中插入患者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的文档,那么花点时间去读一下是值得的,并尝试一些使用INNER JOIN的查询。
祝你好运!