【问题标题】:Natural sorting Ajax Datatables in CodeigniterCodeigniter 中的自然排序 Ajax 数据表
【发布时间】:2020-04-25 07:42:11
【问题描述】:

努力弄清楚如何使用 Codeigniter 活动记录在 AJAX 数据表中设置自然排序。 应该排序的字段在大多数情况下只有数字......在其他情况下是字符串,因此 MySQL 表字段设置为 VARCHAR。

我需要自然srt要在Datatables中显示的字段。

活动记录 Codeigniter 查询如下。

function list_all($limit,$start,$col,$dir)
{   
    $this->rmi_db->select (" 
        $this->table_dev.id,
        $this->table_dev.fl,
        $this->table_dev.mm,
        $this->table_dev.batch,
        $this->table_dev.n,
        $this->table_dev.ditta,
        $this->table_dev.tipo,
        $this->table_dev.costruzione,
        $this->table_dev.motori,
        $this->table_dev.nc,
        $this->table_dev.serie,
        $this->table_dev.ca,
        $this->table_dev.consegna,
        $this->table_dev.matr_usaf AS usaf,
        $this->table_dev.matr_usn AS usn,
        $this->table_dev.matr_caf AS caf,
        $this->table_dev.matr_raf AS raf,
        $this->table_dev.codici,
        $this->table_dev.note,
        $this->table_dev.reg_civili,
        $this->table_dev.matricola_civ,
        $this->table_dev.prima_reg,
        $this->table_dev.n_contratto,
        $this->table_dev.data_contratto,
        $this->table_dev.importo_contratto,
        $this->table_dev.note_contratto,
        $this->table_dev.f29,
        $this->table_dev.f30,     
        ");
    $this->rmi_db->from("$this->table_dev");
    $this->rmi_db->where("$this->table_dev.mm !=", "");
    $this->rmi_db->limit($limit, $start);
    $this->rmi_db->order_by($col, $dir);
    $query = $this->rmi_db->get();

    if($query->num_rows()>0)
    {
        return $query->result(); 
    }
    else
    {
        return null;
    }
}

mm 字段应该自然排序。我不知道如何以及是否可以解决这个问题。 我在此讨论solutions 中尝试了解决方案,即 Bin 方式,但选择无法正常工作(出现 500 服务器错误)

非常感谢您的帮助

【问题讨论】:

    标签: mysql codeigniter activerecord natural-sort


    【解决方案1】:

    使用Solution,试试下面。它应该可以工作,但未经测试。

    function list_all($limit,$start,$col,$dir)
    {   
    $this->rmi_db->select (" 
        $this->table_dev.id,
        $this->table_dev.fl,
        $this->table_dev.mm,
        $this->table_dev.mm, CAST($this->table_dev.mm as SIGNED) AS casted_column,//changed
        $this->table_dev.batch,
        $this->table_dev.n,
        $this->table_dev.ditta,
        $this->table_dev.tipo,
        $this->table_dev.costruzione,
        $this->table_dev.motori,
        $this->table_dev.nc,
        $this->table_dev.serie,
        $this->table_dev.ca,
        $this->table_dev.consegna,
        $this->table_dev.matr_usaf AS usaf,
        $this->table_dev.matr_usn AS usn,
        $this->table_dev.matr_caf AS caf,
        $this->table_dev.matr_raf AS raf,
        $this->table_dev.codici,
        $this->table_dev.note,
        $this->table_dev.reg_civili,
        $this->table_dev.matricola_civ,
        $this->table_dev.prima_reg,
        $this->table_dev.n_contratto,
        $this->table_dev.data_contratto,
        $this->table_dev.importo_contratto,
        $this->table_dev.note_contratto,
        $this->table_dev.f29,
        $this->table_dev.f30,     
        ");
    $this->rmi_db->from("$this->table_dev");
    $this->rmi_db->where("$this->table_dev.mm !=", "");
    $this->rmi_db->limit($limit, $start);
    $this->rmi_db->order_by($col, $dir);
    $this->rmi_db->order_by('casted_column', 'ASC'); // changed
    $this->rmi_db->order_by($this->table_dev.mm, 'ASC'); // changed
    $query = $this->rmi_db->get(); //changed
    
    if($query->num_rows()>0)
    {
        return $query->result(); 
    }
    else
    {
        return null;
    }
    }
    

    如果您遇到任何问题,请发表评论

    【讨论】:

    • 非常感谢您抽出宝贵时间帮助安缦。建议的代码没有解决问题...因为 mm 字段未完全按自然排序进行排序...它看起来像是 2 的倍数。您可以在此处查看结果:gavs.it/rmidev
    • 你是否从 $this->db->order_by('name', 'ASC'); 更改了这一行到 $this->db->order_by('mm', 'ASC');
    • 是的,即使以一种奇怪的方式查询现在也是有序的......也许 BIN 修复提供了乘以 2 的结果......你看到上面的链接了吗?而是 1,2,3,4,5 等等......我得到 1,2,4,8,16,32,6,128 等等。再次感谢您的帮助。
    • 是的,我看到了那个输出。请使用 Cast 方式检查更新的答案!
    • 天哪....现在完美运行阿曼!非常感谢。我刚刚编辑了以下行:CAST(name as SIGNED) AS casted_column, into CAST($this->table_dev.mm as SIGNED) AS casted_column,请问“as SIGNED”的目的是什么?感谢您的帮助,我学到了很多东西。非常感谢
    猜你喜欢
    • 2017-06-19
    • 2012-05-14
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多