CakePHP 2.10中的SQL子表达式

6bc51xsx  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(135)

This question准确地描述了我想做的事情,但我想在CakePHP 2.10中做。这可能吗?通常在SQL中“展开”子表达式是可能的吗?我已经尝试了我能想到的几乎所有组合,通常都收到了

Expression #n of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database.table.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

我理解为什么(有很多关于StackOverflow的解释),我想在CakePHP 2.10框架的约束下正确地修复它。我也想避免重写或重组大量现有代码,这样才能适应这种用法,所以我不想使用预准备语句或直接query()调用。这可能吗?

7ivaypg9

7ivaypg91#

假设您有一个社交媒体应用程序,其中您有用户,用户有0个或多个帖子。您想要一个包含用户最近(最高编号)帖子的用户列表,不包括没有帖子的用户。
要获取(user,post-id)对得列表,请执行以下操作:

select U.id,MAX(P.id) as maxPid from users U join posts P on U.id=P.user_id group by U.id;

那么你想要做的就是获取帖子的所有细节沿着它的所有者/用户。

select U.id,MAX(P.id),P.headline as maxPid from users U join posts P on U.id=P.user_id group by U.id;

因为Expression #n of SELECT list is not in GROUP BY clause...的缘故,我们都知道它不起作用。您需要写的是:

select uid,C.headline from posts C join (select U.id,MAX(P.id) as maxPid from users U join posts P on U.id=P.user_id group by U.id) as M on C.id=M.maxPid;

我想问的是,是否有某种方法可以将查询扁平化为三向连接,因为Cake 2无法真正表达嵌套查询。我认为没有,所以下面是我的解决方法:

// Cake find('all', ...) term for the sub-selection.
$selection = [ 'conditions' => ..., 'joins' => ... ];
$dbUser = $this->User->getDataSource();
// Create SQL therefrom:
$joinSubExpr = $dbUser->expression(' join (' . $dbUser->buildStatement($selection, $this->User) . ') as subJ')->value;
// 'Normal' Cake query with generated sub-selection text.
$results = $this->Post->find('all', [
    'conditions' => [ 'Post.id= subJ.maxPid' ],
    'joins' => [ $joinSubExpr ],
    ...]);

为了简单起见,这些都是从我的真实的代码中高度压缩下来的。如果不清楚请评论。

相关问题