Почему запрос UNION ALL рассматривает внешний столбец ORDER как неизвестный?

Я использую unionAll() и отлично возвращаю данные, но мне нужно упорядочить данные и всегда возвращать ошибку, потому что столбец не существует.

$events = $this->Events
    ->find('available')
    ->where([
        'Events.group_of_event_id IS NULL'
    ])
    ->select('Events.id')
    ->select('Events.name')
    ->select('Events.slug')
    ->select('Events.date_event_start')
    ->select([
        'is_group' => 0
    ]);

$groups = $this->GroupOfEvents
    ->find('available')
    ->select('GroupOfEvents.id')
    ->select('GroupOfEvents.name')
    ->select('GroupOfEvents.slug')
    ->select('GroupOfEvents.date_event_start')
    ->select([
        'is_group' => 1
    ]);

$limit = 10;
$page = 1;

if($this->request->query('limit'))
    $limit = $this->request->query('limit');

if($this->request->query('page'))
    $page = $this->request->query('page');

$offset = ($page - 1) * $limit;

$connection = ConnectionManager::get('default');
$union = $events->unionAll($groups)->epilog(
    $connection
        ->newQuery()
        ->order(['date_event_start' => 'ASC'])
        ->limit($limit)
        ->offset($offset)
);

Верните эту ошибку:

Ошибка: SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец «date_event_start» в «условии заказа»


person Jeferson Assis    schedule 03.06.2016    source источник
comment
Всякий раз, когда вы сталкиваетесь с ошибками SQL, вы должны начать с отладки сгенерированных запросов SQL, а также указать их в своем вопросе! Также, пожалуйста, всегда упоминайте СУБД, которую вы используете.   -  person ndm    schedule 03.06.2016


Ответы (1)


Как указано в ошибке, столбца date_event_start нет.

Отключите нормальные SQL-запросы, в которых столбец без префикса таблицы будет возвращаться к ссылке на одну из задействованных таблиц, аналогичного не происходит для результатов объединения, с результатами объединения вы должны явно ссылаться на столбцы по мере их выбора.

Таким образом, вы должны убедиться, что либо столбцы выбраны без префикса таблицы, либо выбрать и использовать правильные псевдонимы в предложении ORDER. Чтобы избежать двусмысленности, я настоятельно рекомендую выбрать последнее, что-то вроде

->select(['date_event_start_alias' => 'Events.date_event_start'])

// ...

->select(['date_event_start_alias' => 'GroupOfEvents.date_event_start'])

// ...

->order(['date_event_start_alias' => 'ASC'])

Следует отметить, что, по крайней мере, с MySQL и Postgres (я не уверен в других СУБД, таких как SQLite или SQL Server), вам действительно нужно установить псевдоним только для первого SELECT. Установка его для всех выборок не нанесет никакого вреда, поэтому я включаю его в пример, но на самом деле это не обязательно.

Смотрите также

person ndm    schedule 03.06.2016