计算:复杂查询与PHP函数调用循环

时间:2012-05-01 01:38:28

标签: php mysql sql

我有这样的查询:

  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. 我不必担心我不需要额外的列。我只能拉出所需的列。
  4. 这对我来说很有用!

    但是,从表现和其他设计角度来看:

    问题:保持原样是好还是我需要考虑在PHP上进行处理? 当我删除查询中的复杂性时,我将不得不做两件事(If,Convert_Tz等)

    1. 循环返回的数组并调用函数来计算时区。
    2. 删除不必要的数组元素。
    3. 你的想法?

      编辑:

      以下是联接:

       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。忽略表和字段名称。我改变了它们。

1 个答案:

答案 0 :(得分:0)

你的服务器的PHP部分可能已经有了一些不错的工作,因此在MySQL中尽可能做到最好是处理问题的正确方法。而且,MySQL的方式比PHP快100倍。并且不用担心大型查询。如果可能的话,做一些代码(例如连接),并记住格式化对于使困难的事情变得更容易非常重要。