0

好吧,我似乎无法弄清楚这一点。我正在处理这个问题的第二天,是时候寻求一些帮助了。

这是有效的 SQL:

SELECT rt1.request_id, rt1.status 
FROM request_transactions rt1 
INNER JOIN (
    SELECT max(id) AS max_id 
    FROM request_transactions 
    GROUP BY request_id
) AS rt2 ON rt1.id = rt2.max_id;

我到底如何使用 Cakephp 3 查询构建器来编写这个?我完全被聚合函数(max)的内部连接所困扰。

提前谢谢了。

编辑:这是表列和数据,如果有帮助的话:

SELECT id, user_id, created, modified FROM requests;

 id | user_id |       created       |      modified       
----+---------+---------------------+---------------------
 94 |     101 | 2017-07-04 18:20:47 | 2017-07-04 18:21:26
 95 |     101 | 2017-07-04 18:48:14 | 2017-07-04 18:48:14
 96 |     101 | 2017-07-04 18:48:40 | 2017-07-04 18:48:40
(3 rows)

SELECT id, status, created, request_id FROM request_transactions;                    

 id  |  status  |       created       | request_id 
-----+----------+---------------------+------------
 127 | created  | 2017-07-04 18:20:47 |         94
 128 | read     | 2017-07-04 18:21:03 |         94
 129 | rejected | 2017-07-04 18:21:26 |         94
 130 | created  | 2017-07-04 18:48:14 |         95
 131 | created  | 2017-07-04 18:48:40 |         96
(5 rows)

SELECT rt1.request_id, rt1.status 
FROM request_transactions rt1 
INNER JOIN (
    SELECT max(id) AS max_id 
    FROM request_transactions 
    GROUP BY request_id
) AS rt2 ON rt1.id = rt2.max_id;

 request_id |  status  
------------+----------
         96 | created
         94 | rejected
         95 | created
(3 rows)
4

2 回答 2

1

好吧!经过一番摸索,我想我有它:

$requestTransactionsModel = $this->loadModel('RequestTransactions');

$query = $requestTransactionsModel->find('all');
$query->select([
    'max_id' => $query->func()->max('id'),
])
->group('request_id');

$query2 = $requestTransactionsModel->find('all');
$query2->select([
    'request_id',
    'status',
])
->join([
    'table' => $query,
    'alias' => 'rt2',
    'type' => 'INNER',
    'conditions' => ['rt2.max_id = RequestTransactions.id'],
]);

这提供了与问题中发布的 SQL 相同的数据。有两个部分我很难找到答案:

我不知道您可以在 join() 中使用查询作为表名。那是反复试验。

我希望条件采用格式

conditions => ['rt2.max_id' => 'RequestTransactions.id']

那行不通。它在 RequestTransactions.id 周围加上引号。它需要写成

conditions => ['rt2.max_id = RequestTransactions.id']
于 2017-07-04T19:20:33.683 回答
0

你可以试试这个:

$result = $this->$requestTransactionsModel->find('all')->join(
    ['requests'=>[
      'table'=>'requests',
      'alias'=>'r',
      'type'=>'inner',
      'conditions'=>['request_transactions.id = r.max_id'],
      ])->group('request_transactions.request_id');
于 2017-07-06T04:23:31.143 回答