我有三张桌子:患者,obg和医生。
请帮助我理解为什么花了这么多时间(超过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 :(得分:1)
我可以建议这样的东西,通过使用concat函数,只允许你在没有OR的情况下使用一次 - 将你的查询更改为:
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 OR和你有一些小问题。你应该在这些地方使用括号,以确保它遵循你的逻辑,就像我的回答