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/59498042/

相关文章:

php - 多个 Select 和 INNER JOIN 多个 Where 子句

ef-code-first - 多对多MVC 5模型代码首先连接表

mysql - SQL 聚合函数 MAX/MIN/AVG/COUNT 的子查询等价物是什么

mysql - 如何返回mysql子查询的行数

javascript - 如何在单个查询中更新多行数据?

php - 在 cakephp 中分配布局

mysql - Mysql中三表无重复减去一张表的并集

MYSQL - 在子查询中是否有 LIMIT 的替代方案?

mysql - 选择 CakePHP 中除一列以外的所有列?

php - 使用composer安装cakePHP 3时出错