使用连接语句和子查询准备 CakePHP 查询

Posted

技术标签:

【中文标题】使用连接语句和子查询准备 CakePHP 查询【英文标题】:CakePHP query preparation with join statement and subquery 【发布时间】:2013-10-08 10:48:28 【问题描述】:

我正在学习 Cakephp,但在操作更复杂的数据库查询时遇到了很大的问题。 所以我想执行那种查询:

SELECT p.name, b.value
FROM books b LEFT JOIN projects p
ON b.project_id=p.id
WHERE b.created=
(SELECT max(b.created) FROM books b WHERE b.user_id=1)
AND b.user_id=1
GROUP BY p.name

谁能帮我用 cakePHP 机制来准备查询?

【问题讨论】:

您是否尝试在带有此 SQL 语句的 Book 模型上使用 find() 方法? 【参考方案1】:

您的代码应该与此类似,假设 Book e Project 有关系 (Book belongsTo Project)

$this->Book->find
(
    'all',
    array
    (
        'fields' => array('Book.value', 'Project.name'),
        'conditions' => array
        (
            'Book.created IN (SELECT MAX(Book.created) FROM books Book WHERE Book.user_id = 1)',
            'Book.user_id' => 1
        ),
        'group' => 'Project.name'
    )
);

【讨论】:

太好了,我想这是我一直在寻找的东西 :) 谢谢【参考方案2】:

使用 IN 子句。

   SELECT p.name, b.value
   FROM books b 
   LEFT JOIN projects p ON b.project_id=p.id
   WHERE b.created IN (SELECT max(created) FROM books  WHERE user_id=1)
   AND b.user_id=1
   GROUP BY p.name

【讨论】:

【参考方案3】:

如果Book和Projects都是Models,可以直接使用Book模型通过CakePHP函数加入,参考https://***.com/a/16286735/2858188

【讨论】:

以上是关于使用连接语句和子查询准备 CakePHP 查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 中的 While 循环使用连接和子查询选择数据

表连接查询与where后使用子查询的性能分析。

选择带有“is null”子句的查询和子选择/左连接不返回结果

如何在此 SELECT 语句中使用 EXISTS 和子查询 [关闭]

CakePHP 2.9 连接查询返回错误结果

SELECT中(非常)常用的子查询操作