Cakephp查询从多用户获取最后一个单字段数据
Cakephp query to get last single field data from multi user
我有一个名为 Transaction
的 table 与关系 User
,事务有一个名为 balance
的字段。
数据看起来像:
id user_id balance
1 22 365
2 22 15
3 22 900
4 32 100
4 32 50
我需要 User
的所有用户关联数据和最后插入的余额字段。例如,此处 id=3
是 user_id=22
的最后插入数据。
原始 SQL 我试过这个:
select * from transactions where id in (select max(id) from transactions group by user_id)
如果我在此处添加内部联接,我知道我还可以检索用户数据。但是我怎样才能在 CakePHP 中做到这一点呢?
恕我直言,subqueries 在 CakePHP 2.x 中很丑陋。您也可以按照@AgRizzo 在评论中的建议,对 SQL 语句进行硬编码并通过 query()
执行它。
但是,当涉及到检索组中的最后一个(最大、最旧等)项目时,有一个更优雅的解决方案。
在此 SQL Fiddle 中,我应用了
中描述的技术
- Retrieving the last record in each group
CakePHP 2.x 等同于:
$this->Transaction->contains('User');
$options['fields'] = array("User.id", "User.name", "Transaction.balance");
$options['joins'] = array(
array('table' => 'transactions',
'alias' => 'Transaction2',
'type' => 'LEFT',
'conditions' => array(
'Transaction2.user_id = Transaction2.user_id',
'Transaction.id < Transaction2.id'
)
),
);
$options['conditions'] = array("Transaction2.id IS NULL");
$transactions=$this->Transaction->find('all', $options);
我有一个名为 Transaction
的 table 与关系 User
,事务有一个名为 balance
的字段。
数据看起来像:
id user_id balance
1 22 365
2 22 15
3 22 900
4 32 100
4 32 50
我需要 User
的所有用户关联数据和最后插入的余额字段。例如,此处 id=3
是 user_id=22
的最后插入数据。
原始 SQL 我试过这个:
select * from transactions where id in (select max(id) from transactions group by user_id)
如果我在此处添加内部联接,我知道我还可以检索用户数据。但是我怎样才能在 CakePHP 中做到这一点呢?
恕我直言,subqueries 在 CakePHP 2.x 中很丑陋。您也可以按照@AgRizzo 在评论中的建议,对 SQL 语句进行硬编码并通过 query()
执行它。
但是,当涉及到检索组中的最后一个(最大、最旧等)项目时,有一个更优雅的解决方案。
在此 SQL Fiddle 中,我应用了
中描述的技术- Retrieving the last record in each group
CakePHP 2.x 等同于:
$this->Transaction->contains('User');
$options['fields'] = array("User.id", "User.name", "Transaction.balance");
$options['joins'] = array(
array('table' => 'transactions',
'alias' => 'Transaction2',
'type' => 'LEFT',
'conditions' => array(
'Transaction2.user_id = Transaction2.user_id',
'Transaction.id < Transaction2.id'
)
),
);
$options['conditions'] = array("Transaction2.id IS NULL");
$transactions=$this->Transaction->find('all', $options);