php - 计算 : Complex Query vs PHP function call in a loop

标签 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. 我不必担心不需要的额外列。我只能拉取所需的列。

这对我来说太棒了!

但是,从性能和其他设计角度来看:

问题:保持原样好还是我需要考虑在 PHP 上进行处理? 当我消除查询中的复杂性时,我将不得不做两件事(If、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 的所有“位置”。忽略表名和字段名。我改变了它们。

最佳答案

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

关于php - 计算 : Complex Query vs PHP function call in a loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10392555/

相关文章:

sql - PSQL 选择以逗号分隔的结果加入连接

javascript - AJAX:如何在单击按钮时更改客户端和服务器端的值?

php - 如何使用 PDO 的 try-catch block

php - 在 MySQL 中计算 z 值

python - MySQL 查询 : check the syntax near '?' . 中的语法错误 '?' 来自哪里?

php - 使用 PHP/Laravel 查询循环

sql - 行级触发器与语句级触发器

PHP Mail 有时可以工作,其他则不行?

php - 如何在 Eloquent ORM Laravel 5.8中保留 "updated_at"的同时删除 "created_at"

php - 将表列中的 DEC 值转换为十六进制