2016-03-02 67 views
0

我有三個表格:患者,obg和醫生執行SQL JOIN需要長

請幫我理解爲什麼需要這麼多時間(超過1分鐘)。當我不使用searchtxt時,我得到的時間較少,但如果我在某些字段中使用searchtxt,則在檢索結果時出現延遲。

SELECT 
      a.ID AS Pt_ID, 
      a.Pt_Name, 
      a.Pt_Sex, 
      Date_Format(a.Pt_DOB,'%Y/%m/%d') as Pt_DOB, 
      a.Pt_Age, 
      a.Pt_Opt_HrF, 
      a.Pt_HrF_Name, 
      a.Pt_Mobile, 
      a.Pt_Address, 
      b.ID as R_ID, 
      Date_Format(b.RP_DATE,'%Y/%m/%d') as RP_DATE, 
      b.B_HISTORY, 
      b.Ref_Dr_ID, 
      Date_Format(b.LMP,'%Y/%m/%d') as LMP, 
      b.H_O_G, 
      b.P_U_S, 
      b.RP_TY, 
      b.Ref_Dr_ID, 
      c.Dr_Name 
FROM 
    patient a, 
    obg b, 
    doctor c 
where 

    a.DEL_FLG='N' and b.DEL_FLG='N' and 
    (b.RP_DATE BETWEEN STR_TO_DATE('".$_POST['frm_dt']."', '%Y/%m/%d') AND STR_TO_DATE('".$_POST['to_dt']."', '%Y/%m/%d')) and 
    a.ID LIKE '%".$_POST['searchtxt']."%' 
OR b.ID LIKE '%".$_POST['searchtxt']."%'  
OR a.Pt_Name LIKE '%".$_POST['searchtxt']."%' 
OR a.Pt_DOB = STR_TO_DATE(".$_POST['searchtxt'].",'%Y/%m/%d') 
OR a.Pt_Address LIKE '%".$_POST['searchtxt']."%' 
OR a.Pt_HrF_Name LIKE '%".$_POST['searchtxt']."%' 
OR a.Pt_Mobile LIKE '%".$_POST['searchtxt']."%' 
a.ID = b.Pt_ID and 
    b.Ref_Dr_ID = c.ID 
order by b.CRTD_DT Desc 
+0

'AND' /'OR'警告... – jarlh

+0

嗨jarlh will you請詳細解釋我在哪裏和/或警告,但我得到這個sql qu的結果它需要超過1分鐘,這是問題 –

+0

也許你可以使用MySQL的任何版本的「for xml path」,並在一個單獨的地方做一個類似的地方,而不是「或」所有這些列。 – artm

回答

1

我可以建議這樣的事情,這將讓你像只有一次沒有或公司使用concat函數使用 - 改變你的查詢是這樣的:

SELECT * 
FROM 
    patient a, 
    obg b, 
    doctor c 
where 
    a.DEL_FLG='N' and b.DEL_FLG='N' 
    AND (b.RP_DATE BETWEEN STR_TO_DATE('".$_POST['frm_dt']."', '%Y/%m/%d') AND STR_TO_DATE('".$_POST['to_dt']."', '%Y/%m/%d')) 
    AND (concat(b.id,'-',a.id,'-',a.Pt_Name,'-',a.Pt_Address,'-', 
      a.Pt_HrF_Name,'-',a.Pt_Mobile) LIKE '%".$_POST['searchtxt']."%' 
    OR a.Pt_DOB = STR_TO_DATE(".$_POST['searchtxt'].",'%Y/%m/%d')) 
    AND a.ID = b.Pt_ID 
    AND b.Ref_Dr_ID = c.ID 
order by b.CRTD_DT Desc 

另外,我覺得你有AND AND AND的一些小問題..你應該在這個地方使用小圓圈來確保它遵循你的邏輯,就像我在回答

+0

這將很容易閱讀,但不解決緩慢的問題,因爲這將不會使用索引 –

+0

以及..最好不要使用索引一次比10 cols – vivoconunxino

+0

@JuanCarlosOropeza我相信它會加快這個查詢消除7 OR的,所以它可能會解決他的問題 – Yossi