2012-05-01 22 views
1

我有這樣的查詢:計算:複雜的查詢與PHP函數調用在一個循環中

Select E.ID, E.NAME, 
    date_format( CONVERT_TZ(CONVERT_TZ(E.ST, '+00:00', '+5:00'), 
    '+00:00', if(ET.GT LIKE '%.5', REPLACE(ET.GT, '.5', ':30') , CONCAT(ET.GT, ':00') 
)), '%Y-%m-%e %r'), concat(date_format( CONVERT_TZ(CONVERT_TZ(E.ET, '+00:00', 
    '+5:00') , '+00:00', if(ET.GT LIKE '%.5', REPLACE(ET.GT, '.5', ':30') , CONCAT( 
    ET.GT, ':00'))), '%Y-%m-%e %r') , ' ', if (TC is NULL, '', concat(TC, 'T'))), 
    EE.CL, EC.EC, CONCAT('##PATH##', E.ID, '/') 

並且這些字段是由4個不同的表拉昇。條件,格式化東西等是將來自東部的日期轉換爲來自其中一個表的每個設置的特定時區。

當然不是一個漂亮的查詢:-)。這是原因,我試圖在查詢中完成所有這些古怪的事情。

  1. 這些結果以數組形式返回,然後編碼爲JSON併發送回調用方。
  2. 我不必循環瀏覽PHP中的結果。我可以按照原樣傳遞結果。
  3. 我不必擔心額外的列,我不需要。我只能拉只需要的列。

這對我來說太棒了!

但是,從性能和其他設計的角度來看(S):

問題:這是很好的保持原樣或我需要考慮一下關於PHP做處理? 我會做兩件事情,當我不再複雜查詢(如果CONVERT_TZ等)

  1. 遍歷返回的數組,並調用一個函數來計算時區。
  2. 刪除不必要的數組元素。

您的想法?

編輯:

這裏是連接:

LEFT JOIN eeemps EER ON e.id = EER.eid 
LEFT JOIN eemp Ee ON eer.empid = ee.empid 
LEFT JOIN EclassS EC ON E.EVN = EC.E_ID 
LEFT JOIN E_tz NE ET ON E.TZID = ET.ID 

where date between x and y, and e_id = 123 

這就是所有 「其中」 cond是。忽略表格和字段名稱。我改變了他們。

+0

顯示查詢的左側部分。 'SELECT'子句永不是瓶頸 – zerkms

+0

增加了連接。 「哪裏」的情況並不複雜。 –

+0

對此有何想法? –

回答

0

你的服務器的PHP部分可能已經有了一些不錯的工作,所以在MySQL中最可能的做法是處理問題的正確方法。而且,MySQL的速度比PHP快100倍99倍。不要擔心大量查詢。如果可能的話,做一些代碼(例如連接),同時也要記住,格式化對於讓困難事情變得更容易非常重要。