php冷门小知识(排序和sql查询)
1、当数据库里某个字段是存的多个值用逗号拼接的,类似于“1,2,3,4,5”;如果你想通过sql查这个字段包含1的数据,怎么查?我来告诉你。tp5.1的框架里面的where条件是这样写的:
$where[] = ['','exp',Db::raw("FIND_IN_SET(".$param['field'].",type)")];
注: 控制器先use think\Db,其中field是传过来的值,type是数据库里的字段名。
2、通过某个字段给数组排序,如果不方便用sql排序的话可以用这个。
$last_names = array_column($userData,'patrol'); array_multisort($last_names,SORT_DESC,$userData);
注:array_column()函数是取出数组中的的"patrol"(自定义字段)一列,然后通过array_multisort()函数排序。SORT_DESC倒序排,$userData是要排序的数组。
3、通过两个字段给数组排序,如果不方便用sql排序的话可以用这个
点击查看代码
//控制器里的代码 usort($informations, array('\app\admin\model\QuestionLibraryList','cmp_sequence_score')); //模型里的方法 public static function cmp_sequence_score($a, $b) { if ($a['is_home_top'] == $b['is_home_top']) { return ($a['update'] > $b['update']) ? -1 : 1; } return ($a['is_home_top'] > $b['is_home_top']) ? -1 : 1; }
注:\app\admin\model\QuestionLibraryList 是模型路径 ,cmp_sequence_score是排序的方法,$informations是要排序的数组,$a和$b是默认参数,不需要变,“is_home_top”是第一个排序值,“update”是第二个排序值。
4、sql里使用if判断(需要修改tp框架底层)
点击查看代码
/** * @param $db 数据库名 * @param $table 表名 * @param $field 字段 * @param $where 条件 * @param $order 排序 * @param int $limit 取得数据条数 * @param int $start 数据取得起始位置 * @param string $keyField 把返回结果的指定的字段值作为二维数组的key */ public static function getRecord($db, $table, $field = '*', $where = '', $limit = 1, $start = 0, $order = '', $group = '', $keyField = '') { if ($limit == 1) { $data = Db::connect($db) ->table($table) ->field($field) ->where($where) ->group($group) ->order($order) ->find(); } else { if ($limit == 0) { $data = Db::connect($db) ->table($table) ->field($field) ->where($where) ->group($group) ->order($order) ->select(); } else { $data = Db::connect($db) ->table($table) ->field($field) ->where($where) ->group($group) ->order($order) ->limit($start, $limit) ->select(); } $ret = []; if (!empty($keyField) && !empty($data)) { foreach ($data as $k => $v) { $ret[$v[$keyField]] = $v; } $data = $ret; } } return $data; }
$is_read = Main::getRecord('库名','表名','count(if(is_read = 1,true,null)) as count,字段1','',0,'','','分组的子段','作为数组键值的字段');
注:获取is_read等于1的数据数量。
5、处理返回数据兼容utf-8格式的代码
点击查看代码
if (!headers_sent()) {
header('Content-Type:application/json;charset=utf-8');
}
6、数据库查询优化,缩短接口请求时间
点击查看代码1游标 $cursor = Db::connect('库名') ->table('表名') ->field('count(查询的字段) as count,字段') ->where($where) ->group('分组的字段') ->cursor(); foreach($cursor as $cursor_key => $cursor_value){ $estimer_count[$cursor_key] = $cursor_value; } 2分块 $master = array(); $chunk = Db::connect('库名') ->table('表名') ->field('字段1, 字段2') ->where($map) ->chunk(10000, function ($events) use (&$master) { foreach ($events as $event_value) { $master[] = $event_value; } });
注:$events是所查出的数据库数据,再按块存到$master里,再返回$master;
结束语:好了,今日知识点就分享到这里。谢谢大家支持。