如何引用列以订购联合查询?

时间:2019-05-23 11:11:25

标签: cakephp sql-order-by union query-builder

我已经在cakephp 3中完成了一个联合,但是该联合正在这样做,以便首先显示买方表记录,然后显示租户。而我希望根据“购买者”和“租户”表中的已创建字段进行排列,因此最新记录将首先出现。我尝试使用Epilog进行该操作,但给出了错误

  

错误:SQLSTATE [42S22]:找不到列:1054在'order子句'中'创建'未知列

$tenant = $this->Tenants
    ->find('all', [
        'fields' => ['Tenants.id', 'Tenants.created', 'Consumers.type'],
        'conditions' => ['Tenants.client_id' => '1'],
        'order' => 'Tenants.created desc'
    ])
    ->contain(['Consumers']);

$buyer = $this->Buyers
    ->find('all', [
        'fields' => ['Buyers.id', 'Buyers.created', 'Consumers.type'],
        'conditions' => ['Buyers.client_id' => '1'],
        'order' => 'Buyers.created desc'
    ])
    ->contain(['Consumers']);

$results = $buyer->unionAll($tenant);
$results->epilog('ORDER BY created DESC LIMIT 7 OFFSET 7');

1 个答案:

答案 0 :(得分:0)

高级ORM查询构建器将使用别名选择列,即它将创建SELECT子句,如下所示:

SELECT Tenants.id AS Tenants__id, Tenants.created AS Tenants__created, etc...

因此,您的Epilog片段将不会看到created列,因此会出现错误。在这种情况下,最简单的方法是通过其位置编号来引用该列(尽管至少在不推荐使用IIRC的MySQL中如此):

ORDER BY 2 DESC

或者另外选择一个带有通用别名的created列,例如:

['Tenants.id', 'Tenants.created', 'created' => 'Tenants.created', 'Consumers.type']
['Buyers.id', 'Buyers.created', 'created' => 'Buyers.created', 'Consumers.type']

将选择类似Tenants.created AS created的列,您可以通过ORDER BYcreated子句中引用它。

至少在MySQL中,如果两个查询对同一列使用不同的别名(因为联合选择基于位置的工作),似乎也可以引用其中一个别名,但是我不确定这是否是对于其他DBMS也是如此,无论如何为了完整起见,以下内容也可以工作:

ORDER BY Tenants__created DESC