背景: 大概10000条数据表中有个 ‘status’ 字段,状态为 0 或 1, 需要把表中的数据按status进行分类。
即:我需要得到这样一个数组(不要纠结于我的命名。。。):
[
0 => [
['id' => 1, 'status' => 0, 'name' => 'zhangsan'],
['id' => 3, 'status' => 0, 'name' => 'zhangsan2'],
......此处省略n行
],
1 => [
['id' => 1, 'status' => 1, 'name' => 'zhangsi'],
['id' => 3, 'status' => 1, 'name' => 'zhangsi2'],
......此处省略n行
],
]
方法一 : mysql 查询一次,利用php遍历分类成数组(不考虑使用php内置array函数)
$sql = 'select * from table';
$res = $model->findBySql($sql)->all();
$arr[0] = [];
$arr[1] = [];
foreach ($res as $var) {
switch ($var->status) {
case 0 :
$arr[0][] = $var;
break;
case 1 :
$arr[1][] = $var;
break;
}
}
return $arr;
方法二 : mysql分别查询两次
$sql0 = 'select * from table where status=0';
$sql1 = 'select * from table where status=1';
$arr[0] = $model->findBySql($sql0)->all();
$arr[1] = $model->findBySql($sql1)->all();
return $arr;
这两种方式那个快?是绝对的吗?
若表中有十万条,一百万条数据呢?
若 status 有 10 种,100 种,1000种呢?
若是只有2个值,那你这个问题就是select*from table.mysql的大忌。方案一的问题在于,数据数量不确定性,php处理可能会超时,因为服务器响应时间一定.数据到了百万就会犹如蜗牛爬树.2.若状态值还有其他的值,你可以在状态上建索引,这样一个mysql where and查出数据,然后再php处理,(ps:即使加了索引,我也不建议你一次性拿出所有数据,因为数据到了一定量级,php处理大数组也会很慢)这时候,你需要加些limt0,10