Home > Backend Development > PHP Tutorial > 关于sql查询的 一些问题

关于sql查询的 一些问题

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-06 20:37:59
Original
946 people have browsed it

在写query查询语句时候,经常会想到这个问题:

1,foreach 循环查询

<code>$data = SELECT...;
foreach($data as &$item)
    $item['sub] = SELECT .... WHERE $item['xx'] ....;
</code>
Copy after login
Copy after login
Copy after login

2,多表关联 join

<code>先多表联合查询,然后重新组装数据
</code>
Copy after login
Copy after login

3,嵌套,子查询


那么问题来了

<code>考虑效率的时候,一般会如何选择,

或者还有其他高效的查询方法;
</code>
Copy after login
Copy after login

update:
可能之前表述有问题,现在我重新又撸了一个示例补充:

虚拟了一个场景:
比如一个文章列表,而这个列表有 分类,标题,简介,作者,发布时间等。而这些数据分别在 article ,user,category,等多个表里面。
这时你需要tree 的结构,在view展示。

<code>接上面问题:
为了得到这个数据,最合适的方法是什么呢 ?
ps:从效率来看

1,多层嵌套 foreach 查询;
2,先多表联合查询出结果,然后重新组装需要的数据结构
...
或者其他
</code>
Copy after login
Copy after login

先感谢大家的回复,同时欢迎大家说说自己看法。thanks

回复内容:

在写query查询语句时候,经常会想到这个问题:

1,foreach 循环查询

<code>$data = SELECT...;
foreach($data as &$item)
    $item['sub] = SELECT .... WHERE $item['xx'] ....;
</code>
Copy after login
Copy after login
Copy after login

2,多表关联 join

<code>先多表联合查询,然后重新组装数据
</code>
Copy after login
Copy after login

3,嵌套,子查询


那么问题来了

<code>考虑效率的时候,一般会如何选择,

或者还有其他高效的查询方法;
</code>
Copy after login
Copy after login

update:
可能之前表述有问题,现在我重新又撸了一个示例补充:

虚拟了一个场景:
比如一个文章列表,而这个列表有 分类,标题,简介,作者,发布时间等。而这些数据分别在 article ,user,category,等多个表里面。
这时你需要tree 的结构,在view展示。

<code>接上面问题:
为了得到这个数据,最合适的方法是什么呢 ?
ps:从效率来看

1,多层嵌套 foreach 查询;
2,先多表联合查询出结果,然后重新组装需要的数据结构
...
或者其他
</code>
Copy after login
Copy after login

先感谢大家的回复,同时欢迎大家说说自己看法。thanks

一般原则是尽量少在循环中操作 SQL,针对你第一个给出的 DEMO 可以使用 SELECT WHERE IN 整合成一次查询。

像这种查询数据量不是太大的话可以将数据合并到一个表中在去查询。
一般来说:

<code>$data = SELECT...;
foreach($data as &$item)
    $item['sub] = SELECT .... WHERE $item['xx'] ....;
</code>
Copy after login
Copy after login
Copy after login

你既然这么做了,这个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>
Copy after login

把你主表产生的where条件全部保存起来,生成一个sql,去查附表,然后套两个foreach,将数组重新组合起来。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Issues
php data acquisition?
From 1970-01-01 08:00:00
0
0
0
PHP extension intl
From 1970-01-01 08:00:00
0
0
0
How to learn php well
From 1970-01-01 08:00:00
0
0
0
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template