Concat在查询或循环结果

时间:2013-08-19 14:22:38

标签: php mysql sql

什么会更好? (考虑性能,可维护性,可读性)

伪代码:

SELECT CONCAT('<td>', user_firstname, '</td>') FROM TableA;

OR

$results = SELECT user_firstname FROM TableA
foreach($result as $fname) {
    $row .= '<td>'.$fname.'</td>';
}

我觉得在查询中这样做会更好,因为PHP不必循环遍历它(在TableA中假设约20,000行)。但是我也认为将来看到这段代码的人会想知道为什么你会在查询中这样做。

编辑:我问的主要原因是我们在其他地方为这个数据集进行php循环是非常耗费内存的。

3 个答案:

答案 0 :(得分:3)

我肯定会选择返回普通数据并使用PHP进行操作。毫无疑问,你无论如何都会在结果中循环,那么为什么不在声音时间的任何一侧回复标签呢?

然而,这不是我的主要推理 - 如果你最终为多个实例使用相同的数据,你可以缓存并重新使用结果,根据使用要求将返回的数据实现到不同的模板中(如果返回的数据集在每一行都有特定于视图的代码。

此外,查询应该与创建视图的代码分开,因此在更新最终标记时,更容易修改创建标记的PHP(与其他标记位于同一文件中),查找查询以使标记更改。 echo '<th>'.$field.'</th>';的意图也比echo $field;更明确。

在一天结束时,这取决于个人偏好,但是为了进入MVC结构的良好实践以及通常干净和可维护的代码,我肯定会投票支持在PHP中完成标记

<强> TL; DR

  • 使用PHP - 无论如何你可能会用它循环
  • echo '<th>'.$field.'</th>';具有比echo $field;
  • 更清晰的意图(更具可读性)
  • 如果要在其他地方使用数据,您可以使用不同的标记模板缓存单个查询以重复使用,而不是每次都添加不同的包装标记的多个查询
  • 数据库最好留给数据检索以便易读(因此MVC移动),然后可以通过更适合作业的语言(例如PHP)来操纵这些数据

答案 1 :(得分:2)

如果要返回20,000行,可能无论如何都要绕过它们。如果是这样,那么在php或MySQL中完成工作之间的性能差异很小。

赞成在MySQL中这样做是因为数据库可以轻松地完成这种类型的工作,并且许多数据库可以利用多个处理器来使其运行得更快。我更喜欢以需要的方式返回结果,这很容易。

支持在php中执行此操作是因为您从数据库返回的字符较少,因此网络上的性能实际上可能会有很小的提升。这将被申请方的工作所抵消。

出于维护和可读性的原因,我会在数据库中这样做。提取数据的逻辑在一个地方而不是两个地方,用一种语言而不是两种语言表达。

答案 2 :(得分:1)

在PHP端完成 - 为什么?使您的数据层与表示层分开。 SQL应该有一个作业,只有一个作业。那就是查询和检索原始数据。第二个你开始使用SQL做的东西它不是设计的第二个你的应用程序开始走下坡路并开始变得难以维护。按预期使用服务器,并从SQL检索数据,在Web服务器端完成它(将其放入表中等)