这个问题可能被标记为过于宽泛或基于意见,但我承担风险...
我在php中有一个REST-API,它从mysql表中获取所有数据,其中还包含'hasMany'字段。让我们称他们为'post'hasMany'comments'。
现在我在评论中选择LEFT JOIN进行一次选择,然后遍历结果以将输出重组为
{ "posts": [
{"id": 1,
"comments": [1,2,3]
},
....
]}
一切都很好,直到我有多个hasMany字段,因为然后重构变得复杂(现在产生双条目)我需要循环遍历结果(不是手动,但仍然使用内置函数)多次
所以我考虑重构我的代码:
1.选择实际项目('post')
2.选择所有hasMany字段('comments','anythingelse',...)并添加结果
这当然会对我的数据库产生大量的动作。
所以我的问题是如果有人有一个简单的答案,比如“更好地从数据库中一次性获取所有数据并在php中完成工作”或相反。
是的,我自己可以做基准测试。但是拳头 - 说实话我想避免所有重新编程只是为了发现它更慢 - 第二我不知道我的基准测试是否会在优化(和linux)生产机器上保持不变(现在我正在开发在windows上的easyPhp上。)
一些信息: 'post'表可能会产生大约100条记录,每条记录都与hasMany相同。但结合一些hasMany字段,它可能会产生数千个记录集(第一个aproach)。
答案 0 :(得分:0)
我能想到的最佳选择将是:
$posts = $dbh->prepare('SELECT [fields] FROM posts WHERE [conditions]')->
execute([...])->
fetchAll();
$stmt = $dbh->prepare('SELECT id FROM comments WHERE post_id = ?');
for($i=0; $i<count($posts); $i++) {
$stmt->execute($posts[$i]['id']);
$posts[$i]['comments'] = $stmt->fetchAll();
}
您需要决定交易与重复之间的工作/间接权衡。作为联接结果的数据或多或少是单独检索每个帖子的评论。
如果您正在使用ORM,可能会自动发生上述行为。
答案 1 :(得分:0)
使用IN (…)
运算符。
首先,自行获取相关帖子:
SELECT […stuff…] FROM posts WHERE […conditions…]
然后从您到达的结果中获取帖子ID列表,并将整个列表替换为一组表单查询:
SELECT […stuff…] FROM comments WHERE post_id IN (1, 2, 3 […etc…])
SELECT […stuff…] FROM anythingelse WHERE post_id IN (1, 2, 3 […etc…])
每个依赖表运行一个查询就可以了。它不比运行单个JOINed查询贵得多;事实上,它可能更便宜,因为父表中的字段没有重复。
确保post_id
列在子表上编入索引。