Heim >Backend-Entwicklung >PHP-Tutorial >关于sql查询的 一些问题
1,foreach 循环查询
<code>$data = SELECT...; foreach($data as &$item) $item['sub] = SELECT .... WHERE $item['xx'] ....; </code>
2,多表关联 join
<code>先多表联合查询,然后重新组装数据 </code>
3,嵌套,子查询
那么问题来了
<code>考虑效率的时候,一般会如何选择, 或者还有其他高效的查询方法; </code>
update:
可能之前表述有问题,现在我重新又撸了一个示例补充:
虚拟了一个场景:
比如一个文章列表,而这个列表有 分类,标题,简介,作者,发布时间等。而这些数据分别在 article ,user,category,等多个表里面。
这时你需要tree 的结构,在view展示。
<code>接上面问题: 为了得到这个数据,最合适的方法是什么呢 ? ps:从效率来看 1,多层嵌套 foreach 查询; 2,先多表联合查询出结果,然后重新组装需要的数据结构 ... 或者其他 </code>
先感谢大家的回复,同时欢迎大家说说自己看法。thanks
1,foreach 循环查询
<code>$data = SELECT...; foreach($data as &$item) $item['sub] = SELECT .... WHERE $item['xx'] ....; </code>
2,多表关联 join
<code>先多表联合查询,然后重新组装数据 </code>
3,嵌套,子查询
那么问题来了
<code>考虑效率的时候,一般会如何选择, 或者还有其他高效的查询方法; </code>
update:
可能之前表述有问题,现在我重新又撸了一个示例补充:
虚拟了一个场景:
比如一个文章列表,而这个列表有 分类,标题,简介,作者,发布时间等。而这些数据分别在 article ,user,category,等多个表里面。
这时你需要tree 的结构,在view展示。
<code>接上面问题: 为了得到这个数据,最合适的方法是什么呢 ? ps:从效率来看 1,多层嵌套 foreach 查询; 2,先多表联合查询出结果,然后重新组装需要的数据结构 ... 或者其他 </code>
先感谢大家的回复,同时欢迎大家说说自己看法。thanks
一般原则是尽量少在循环中操作 SQL,针对你第一个给出的 DEMO 可以使用 SELECT WHERE IN
整合成一次查询。
像这种查询数据量不是太大的话可以将数据合并到一个表中在去查询。
一般来说:
<code>$data = SELECT...; foreach($data as &$item) $item['sub] = SELECT .... WHERE $item['xx'] ....; </code>
你既然这么做了,这个for相信也不是太多,太耗时,如果在加上建了相关索引的话,效率上不存在问题,目测100ms内。
<code>php</code><code><?php // // 假设 // user (id, name, pwd) // project(id, uid, name) // // 用户发项目 // // 正常情况大家会这么写, // 通过连表进行查询 // 但是有个问题, 当数据量比较大的时候 // 连表性能比较差 $sql = "select * from project left join user on user.id=project.uid"; // 另一种写法 $sql = "select * from project"; $projectData = findSql($sql); $uidList = array(); foreach($projectData as $val) { $uidList[] = $val['uid']; } $uidListStr = implode(',', $uidList); $sql = "select * from user where id in ($uidListStr)"; $userData = findSql($sql); $uid2User = array(); foreach($userData as $val) { $uid2User[$val['id']] = $val; } $result = array(); foreach($projectData as $val) { $result = $val + array('user' => $uid2User[$val['id']]); } // 这里 $resut 是我们需要的 // 这种方法写了长长的一串, // 当数据量特别大的时候, 是不允许进行连表的, // 同时这么写也方便进行缓存 </code>
把你主表产生的where条件全部保存起来,生成一个sql,去查附表,然后套两个foreach,将数组重新组合起来。