如何在Kohana的查询构建器中使用ORDER BY和GROUP BY构建UNION查询?

时间:2011-04-09 03:00:38

标签: php mysql kohana-3

我正在尝试使用Kohana's query builder构建UNION查询。在我添加GROUP BY或ORDER BY子句之前,一切正常。

以下是我正在使用的代码(简化):

$query1 = DB::select('p.name')
    ->from(array('person', 'p'))
    ->where('p.organization', 'LIKE', 'foo%')
    ->limit(10);

$names = DB::select('sh.name')
    ->union($query1, FALSE)
    ->from(array('stakeholder', 'sh'))
    ->where('sh.organization', 'LIKE', 'foo%')
    ->group_by('name')
    ->order_by('name')
    ->limit(10)
    ->execute()
    ->as_array();

不是在整个查询结束时添加GROUP BY和ORDER BY,而是在第二次查询后立即添加它。

这是它生成的SQL:

 SELECT sh.name FROM stakeholder AS sh WHERE sh.organization LIKE 'foo%' 
 GROUP BY name ORDER BY name LIMIT 10
 UNION
 SELECT p.name from person AS p WHERE p.organization LIKE 'foo%' LIMIT 10;

我想要的是:

 SELECT sh.name FROM stakeholder AS sh WHERE sh.organization LIKE 'foo%'
 UNION
 SELECT p.name from person AS p WHERE p.organization LIKE 'foo%'
 GROUP BY name ORDER BY name LIMIT 10;

3 个答案:

答案 0 :(得分:6)

这里的条款是从union()方法中设置的第一个查询中应用的,所以只需将它放在您放置它们的位置:

$query1 = DB::select('p.name')
              ->from(array('person', 'p'))
              ->where('p.organization', 'LIKE', 'foo%')
              ->group_by('name')
              ->order_by('name')
              ->limit(10);

$names = DB::select('sh.name')
              ->union($query1, FALSE)
              ->from(array('stakeholder', 'sh'))
              ->where('sh.organization', 'LIKE', 'foo%')
              ->execute()
              ->as_array();

您还可以从->limit(10)中删除多余的$names,因为它会被忽略并被$query1中的{。}}取代。

答案 1 :(得分:0)

2011年的回答并非在Kohana 3.3中发挥作用。

但我找到了这个模块:https://github.com/Invision70/kohana-orm-union

答案 2 :(得分:0)

您还可以使用ORM的db_pending:

扩展Kohana_ORM
class ORM extends Kohana_ORM {
    public function union($table, $all = TRUE)
    {
        // Add pending database call which is executed after query type is determined
        $this->_db_pending[] = array(
            'name' => 'union',
            'args' => array($table, $all),
        );

        return $this;
    }
}

用法:

ORM::factory('MyModel')
    ->union(DB::select(DB::expr("'RP' id, 'Pasantías' name, 'Pasantías' short_name, 'R' parent_id, null data")))
    ->union(DB::select(DB::expr("'RC' id, 'Capacitación' name, 'Capacitación' short_name, 'R' parent_id, null data")))
    ->join(['catalogo', 'p'])->on('catalogo.parent_id', '=', 'p.id')
    ->where('p.parent_id', 'is', NULL)
    ->where('catalogo.id', 'not in', ['RV', 'RPA', 'RPT']);