Как построить запрос UNION с ORDER BY и GROUP BY в конструкторе запросов Kohana? - PullRequest
4 голосов
/ 09 апреля 2011

Я пытаюсь построить запрос 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 ]

6 голосов
/ 09 апреля 2011

Предложения здесь применяются из первого запроса, настроенного в методе 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.

0 голосов
/ 22 марта 2016

Вы также можете расширить Kohana_ORM, используя db_pending от 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']);
0 голосов
/ 14 августа 2015

Этот ответ с 2011 года не работает в Кохане 3.3.

Но я нашел этот модуль: https://github.com/Invision70/kohana-orm-union

...