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)