【问题标题】:How to reference columns to order a union query?如何引用列来排序联合查询?
【发布时间】:2019-05-23 11:11:24
【问题描述】:

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

错误:SQLSTATE[42S22]:未找到列:1054 在“订单子句”中“创建”未知列

$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');

【问题讨论】:

  • 这两张表是什么关系

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


【解决方案1】:

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

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

因此,您的 Epilog sn-p 不会看到 created 列,因此会出现错误。在这种情况下,最简单的方法是通过其位置编号引用该列(尽管至少在 MySQL 中已弃用 IIRC!):

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 这样的列,您可以通过createdORDER BY 子句中引用它。

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

ORDER BY Tenants__created DESC

【讨论】:

  • 分页不工作 $results = $buyer->unionAll($tenant); $results->epilog('ORDER BY created DESC');
  • @UsmanSaeed 这是一个不同的问题,例如查看 stackoverflow.com/questions/29379579/…,您必须在子查询中使用联合。
  • 好的,谢谢,知道代码是什么吗?
  • @UsmanSaeed 请检查链接的答案,它包含一个示例。
  • 试过但没有成功
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多