2016-08-23 178 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

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

相關問題