轻鸿羽过

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;

结束语:好了,今日知识点就分享到这里。谢谢大家支持。

 

posted on 2021-07-16 14:16  轻鸿羽过  阅读(221)  评论(0编辑  收藏  举报

导航