MySQL查询Code Igniter Active Directory格式?

时间:2013-11-12 14:03:12

标签: php mysql codeigniter

我正在尝试将mysql查询转换为Code Igniter的Active Record语法,但是我有点困难。

该问题是Multiple mysql ORDER BY's for multidimensional ordering/grouping

的结果

我自己尝试格式化查询,解决了一些错误,但我不确定如何进展。我必须自己将get_compiled_select()函数添加到DB_active_rec.php,并将_reset_select()从受保护更改为公开,以使其完全运行。

建议的查询是:

select
  t.id,
  t.group,
  t.date,
  t.comlete
from
  YourTable t
  left join
    (select
      m.group,
      min(m.date) as mindate,
      min(t.complete) as groupcomplete
    from
      YourTable m) mt on mt.group = t.group
order by
  coalesce(mt.groupcomplete, t.complete),
  coalesce(mt.mindate, t.date),
  t.group,
  t.complete,
  t.date

我的翻译看起来像这样(注意原文中有'where'子句,'date'实际上是'到期'):

        // Sub query
        $this->db->select('m.group, min(m.due) as mindate, min(t.complete) as groupcomplete');
        $this->db->from('task m');
        $this->db->where('property', $property);

        $subquery = $this->db->get_compiled_select();

        $this->db->_reset_select();

        // Main query
        $this->db->select('*');
        $this->db->where('property', $property);
        $this->db->from('task t');
        $this->db->join('($subquery) mt','mt.group = t.group');

        $this->db->order_by('coalesce(mt.groupcomplete, t.complete)');
        $this->db->order_by('coalesce(mt.mindate, t.due)');
        $this->db->order_by('t.group');
        $this->db->order_by('t.complete');
        $this->db->order_by('t.due');

        $query = $this -> db -> get();

        // Return
        return $query->result();

不幸的是,这只是一个错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mt ON `mt`.`group` = `t`.`group` WHERE `property` = '7' ORDER BY coalesce(mt.gr' at line 3

CI报告的查询如下所示:

SELECT * FROM (`task` t) JOIN ($subquery) mt ON `mt`.`group` = `t`.`group` WHERE `property` = '7' ORDER BY coalesce(mt.groupcomplete, `t`.`complete)`, coalesce(mt.mindate, `t`.`date)`, `t`.`due`, `t`.`complete`, `t`.`date`

任何人都可以提供一些关于如何正确格式化的建议吗?不幸的是,我的mysql技能非常简陋,所以这正在推动我的能力。我翻译的大部分方法来自Stack Overflow的答案,因为我没有以这种方式组合查询的经验(使用子查询)。

2 个答案:

答案 0 :(得分:1)

当您有多个按顺序排序时,请用逗号分隔它们

    $this->db->order_by('coalesce(mt.groupcomplete, t.complete), coalesce(mt.mindate, t.date), t.due, t.complete, t.date');

答案 1 :(得分:1)

问题(或“其中一个问题”)在这里:

$this->db->join('($subquery) mt','mt.group = t.group');

您使用单引号,因此变量$ subquery不会扩展。 这也可以在CodeIgniter输出的查询中看到。