我试图通过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();
答案 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')