无法按升序对查询结果进行排序

时间:2016-02-08 03:32:19

标签: php mysql yii

我试图通过Meds_Name按升序对以下选择查询进行排序,但无法弄清楚我做错了什么。它首先将所有以小写字母开头的名称排序,然后跟着那些以大写字母开头的名称。

查询在我解释它并在MySQL中执行时起作用,但不在Yii中。任何人都可以看到我出错的地方:

$specs = Yii::app()->db->createCommand()
                ->select("im.*,m.name as Meds_Name,mf.name as Meds_Freq_name,
                            mr.name as Meds_Route_name,mu.name as Meds_Unit_name,
                            CONCAT_WS('/',im.Meds_StartMM,im.Meds_StartYYYY) as Meds_StartDate,
                            CONCAT_WS('/',im.Meds_EndMM,im.Meds_EndYYYY) as Meds_EndDate")
                ->from('indiv_meds im')
                ->leftJoin('meds m', 'im.Meds_Name=m.id')
                ->leftJoin('med_freq mf', 'im.Meds_Freq=mf.id')
                ->leftJoin('med_route mr', 'im.Meds_Route=mr.id')
                ->leftJoin('lkpmeds mu', 'im.Meds_Unit=mu.id')
                ->where($select_condition_declare)
                ->limit($limit, $start)
                ->order(array('Meds_Name asc'))
                ->queryAll();

3 个答案:

答案 0 :(得分:1)

这只是因为结果排序基于ASCII码。您可以通过将查询结果排序列转换为小写/大写来解决问题:

$specs = Yii::app()->db->createCommand()
                ->select("im.*, LOWER(m.name) as Meds_Name,mf.name as Meds_Freq_name,
                            mr.name as Meds_Route_name,mu.name as Meds_Unit_name,
                            CONCAT_WS('/',im.Meds_StartMM,im.Meds_StartYYYY) as Meds_StartDate,
                            CONCAT_WS('/',im.Meds_EndMM,im.Meds_EndYYYY) as Meds_EndDate")
                ->from('indiv_meds im')
                ->leftJoin('meds m', 'im.Meds_Name=m.id')
                ->leftJoin('med_freq mf', 'im.Meds_Freq=mf.id')
                ->leftJoin('med_route mr', 'im.Meds_Route=mr.id')
                ->leftJoin('lkpmeds mu', 'im.Meds_Unit=mu.id')
                ->where($select_condition_declare)
                ->limit($limit, $start)
                ->order(array('Meds_Name asc'))
                ->queryAll();

答案 1 :(得分:1)

我对Yii了解不多,但我觉得这可能对你有所帮助:

->order(array('m.name asc'))
->limit($limit, $start)

“LIMIT”总是在“ORDER BY”之后出现

更新

好的,明白了:)

@sharcfinz我在这里看到这个URL http://www.yiiframework.com/doc-2.0/guide-db-query-builder.html 他们用这种方式

new \yii\db\Query()
查询生成器的

我认为您只是将查询生成器命令与直接SQL查询命令混合了一下

Yii::app()->db->createCommand()

你正在使用。

当您要直接插入dentire SQL查询命令时使用“createCommand()”,如

Yii::app()->db->createCommand("SELECT id, name FROM tableA")->queryAll();

但要使用“ - > select()”,“ - > order()”等,你必须使用这种方式

$rows = (new \yii\db\Query())
    ->select(['id', 'email'])
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->limit(10)
    ->all();

答案 2 :(得分:0)

按顺序更改订单,

->order('m.Meds_Name asc')