我正在使用unionAll()
并完美地返回数据,但我需要对数据进行ordernate并始终返回错误,因为该列不存在。
$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'order clause'中的未知列'date_event_start'
答案 0 :(得分:2)
如错误所述,没有date_event_start
列。
Unlinke normale 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(我不确定其他DBMS如SQLite或SQL Server),实际上只需要为第一个SELECT
设置别名。为所有选择设置它不会造成任何伤害,因此我将其包含在示例中,但实际上并不是必需的。
另见