一个SQL查询,或循环中的许多查询?

Ben*_*lap 3 php sql design-patterns

我需要从表中提取几行并以两种方式处理它们:

  • 聚合在一个密钥上
  • 逐行排序,按相同的键排序

该表看起来大致如下:

table (
   key,
   string_data,
   numeric_data
)
Run Code Online (Sandbox Code Playgroud)

所以我正在研究我正在写的函数的两种方法.

第一个是使用一个查询拉取聚合数据,然后在循环内再次查询每组逐行数据(以下是类似PHP的伪代码):

$rows = query(
        "SELECT key,SUM(numeric_data)
         FROM table
         GROUP BY key"
    );

foreach ($rows as $row) {
    <process aggregate data in $row>

    $key = $row['key'];
    $row_by_row_data = handle_individual_rows($key);
}

function handle_individual_rows($key)
{
    $rows = query(
            "SELECT string_data
             FROM table WHERE key=?",
            $key
        );

    <process $rows one row at a time>

    return $processed_data;
}
Run Code Online (Sandbox Code Playgroud)

或者,我可以做一个大的查询,并让代码完成所有工作:

$rows = query(
    "SELECT key, string_data, numeric_data
     FROM table"
);

foreach ($rows as $row) {
    <process rows individually and calculate aggregates as I go>
}
Run Code Online (Sandbox Code Playgroud)

在该应用中,性能不是实际问题; 我只是想编写合理且可维护的代码.

我喜欢第一个选项,因为它更模块化 - 我喜欢第二个选项,因为它看起来结构简单.一种选择比另一种更好还是真的只是风格问题?

Qua*_*noi 12

一个SQL查询,当然.

这将

  • 为您节省大量往返数据库
  • 允许使用更有效的GROUP BY方法

由于数据库可以很好地执行聚合,因此对于可维护性也更好:您将所有结果集逻辑放在一个位置.

以下是返回每一行并计算以下内容的查询示例SUM:

SELECT  string_data, numeric_data, SUM(numeric_data) OVER (PARTITION BY key)
FROM    table
Run Code Online (Sandbox Code Playgroud)

请注意,这很可能会使用并行访问来计算SUM不同key的,这在很难实现PHP.

相同的查询MySQL:

SELECT  key, string_data, numeric_data,
        (
        SELECT  SUM(numeric_data)
        FROM    table ti
        WHERE   ti.key = to.key
        ) AS key_sum
FROM    table to
Run Code Online (Sandbox Code Playgroud)