cakephp - 如何创建使用子查询的联接?

标签 cakephp join subquery query-builder cakephp-2.x

如何将以下 SQL 查询转换为 CakePhp 查找查询?

SELECT
    a.id, a.rev, a.contents
FROM
    YourTable a
INNER JOIN (
    SELECT
        id, MAX(rev) rev
    FROM
        YourTable
    GROUP BY
        id
) b ON a.id = b.id AND a.rev = b.rev

我已经尝试过以下代码:

return $model->find('all', [
    'fields' => $fields,
    'joins' => [
        [
            'table' => $model->useTable,
            'fields' => ['id','MAX(rev) as rev'],
            'alias' => 'max_rev_table',
            'type' => 'INNER',
            'group' => ['id'],
            'conditions' => [
                $model->name.'.id= max_rev_table.id',
                $model->name.'.rev = max_rev_table.rev'
            ]
        ]
    ],
    'conditions' => [
        $model->name.'.emp_id' => $empId
    ]
]);

但是生成的SQL中似乎没有包含joins下的字段。所以我没有得到 max(rev),我只需要获取具有 max(rev) 的行。

我尝试重新排列 joins 中的项目,但仍然生成相同的自动生成的 SQL。

你能帮我吗?

最佳答案

连接没有fieldsgroup选项,唯一的选项是tablealias类型条件

如果你想加入子查询,那么你需要显式生成一个:

$ds = $model->getDataSource();
$subquery = $ds->buildStatement(
    array(
        'fields' => array('MaxRev.id', 'MAX(rev) as rev'),
        'table'  => $ds->fullTableName($model),
        'alias'  => 'MaxRev',
        'group'  => array('MaxRev.id')
    ),
    $model
);

并将其传递给连接table选项:

'table' => "($subquery)"

另请参阅

关于cakephp - 如何创建使用子查询的联接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49168867/

相关文章:

mysql - 如何在 MySQL 中使用 ORDER BY FIELD 和子查询?

php - 将大型数组存储在数据库中

cakephp - 如何使用 CakePHP 中的 SimpleTest 处理固定装置中的外键关系以进行单元测试?

mysql - 在我的 MySQL 中,使用 JOIN 一词或使用 : table1. id=table2.id 之间有什么区别

php - 如何在codeigniter中基于关联实体获取数据

mysql - 使用 WHERE 子句从 MySQL 中同一表的行中删除

php - 如何循环遍历多个 MySQL 列并返回单行结果?

php - 如何使用 INNER JOIN (PDO) 获得像 CakePHP 这样的结果?是否可以仅使用 PDO?

php - 使用 cakephp 3 根据第二个表从数据库中查找记录

MySQL:如何从集合中删除行?