2016-08-23 177 views
1

我有3个表格。 第一张桌: 患者:patid,fname,lname,recordnum。 PATIENTDR:patid,drid, PATIENTCLIN:patid,clinid。如何从第一个表中选择ID是否存在于第二个或第三个表中高效?

如果DRID =“$ docotr-> id”或“PATIENTCLIN”,如果CLINID =“$ clinic”,如果在表“PATIENTDR”中找到“PATID”,则需要通过fname或lname选择患者 - > 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,并采取在考虑下面的注释进行检索:

”使用SQL语句由于子查询是RE-RUN fo,所以MySQL中的EXISTS条件非常低效r外部查询表中的每一行。有更有效的方法来编写大多数查询,不使用EXISTS条件。“

是否有更有效的方式来编写此查询,也许我应该打破规则,插入患者fname和lname表patientdr和patientclin ?减少响应时间,或通过限制结果,以10行是提前的所有形式的帮助足够有效的 感谢

+1

如果你内在加入他们,并且没有匹配的id,那么他们将不会返回结果。我想这将是最有效的。 –

回答

1

正如评论所提到的,这可以用一个简单内得到解决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的文档,那么值得参考有时候这样做,并且玩弄一些使用它的查询。

祝你好运!

+0

@jakebules嗯..它接缝,我得到两个病人作为结果,如果在其他两个表中找到相同的ID。不应该把这个结果与这个查询结合起来,只有一个患者因为一个ID而结果吗? – Dime

+0

@jakebules使用UNION DISTINCT修复它,请您更新答案,谢谢。 – Dime

+1

我已经更新了我的答案。 –

相关问题