【问题标题】:Yii: Query builder: expression in orderYii:查询生成器:按顺序表达
【发布时间】:2014-10-05 17:19:56
【问题描述】:

在 AC 中,这个顺序很好用,但是查询生成器引用错误,结果错误

$models = Yii::app()->db->createCommand()
->select('id, user_id, title, created, modified, lang, forum_id, post_id, status, views, replies, attached')
->from('posts')
->where('post_id = 0')
->order('attached AND forum_id = 1 AND created DESC, created DESC')
->limit(11)
->queryAll();

错误:

CDbCommand не удалось исполнить SQL-запрос:SQLSTATE[42S22]:未找到列:1054 未知列“附加 AND forum_id = 1 AND created”在“订单子句”中。执行的SQL语句为:SELECT id, user_id, title, created, modified, lang, forum_id, post_id, status, replies1 , attached 来自posts 在哪里 post_id = 0 由attached AND forum_id = 1 AND created DESC、replies DESC、created DESC LIMIT 11 订购

如何解决?

附:对不起我的英语。

【问题讨论】:

  • 'attached AND forum_id = 1 AND created DESC, created DESC' 不是有效的订单条款。

标签: php yii expression builder


【解决方案1】:

您的whereorder 应该是:

->where('post_id = 0')
->order('CASE WHEN forum_id =1 THEN 1 ELSE 2 END, created DESC')

参考:How do I return rows with a specific value first?

【讨论】:

  • 我不需要只获取forum_id = 1的帖子,它必须是第一个然后是另一个帖子
  • 那你为什么不先通过id订购呢?
  • 看:attached AND forum_id = 1 AND created DESC, created DESC 1) “attached AND forun_id = 1 AND created DESC”.. 意味着我需要第一个帖子,这些帖子附加在论坛部分,ID 为 1( News & Annoces ..) 并且此帖子必须按“created DESC”排序(顶部新)。 2) ..",created DESC" 另一个帖子必须排序只在创建时间。我不想按 id 排序
  • 正如您的错误所述,错误是由文本 ORDER BY attached AND forum_id = 1 AND created DESC, replies DESC, created DESC LIMIT 11 引起的。我已经用指定订单的 SQL 标准方式更新了答案。
  • 再一次没有。我的查询在 AC Find 中运行良好,或者如果在 ORDER 方法中删除 CDbCommand 中的过滤器:github.com/yiisoft/yii/blob/1.1.15/framework/db/… 例如: public function order($columns) { $this->_query['order']=$columns;返回$这个;只是我不想更改 yii 文件,但是这种方法会自动插入引号什么破坏字符串。
【解决方案2】:

您应该在圆括号中使用顺序表达式以避免检查列。这必须工作

->order('(attached AND forum_id = 1 AND created) DESC, created DESC')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多