编程语言
首页 > 编程语言> > php – 如何在Kohana的查询构建器中使用ORDER BY和GROUP BY构建UNION查询?

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

作者:互联网

我正在尝试使用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;

解决方法:

这里的子句是从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();

您还可以从$names中删除多余的 – > limit(10),因为它将被忽略并被$query1中的一个取代.

标签:php,mysql,kohana-3
来源: https://codeday.me/bug/20190531/1187872.html