如果ID高效存在于第二或第三表中,如何从第一个表中进行选择?

时间:2016-08-23 22:43:04

标签: php mysql

我有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行是否足够有效? 感谢您提前提供各种帮助。

1 个答案:

答案 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的文档,那么值得花时间这样做,并且可以使用一些使用它的查询。

祝你好运!