【问题标题】:How to write a Select with subquery in CakePHP如何在 CakePHP 中编写带有子查询的 Select
【发布时间】:2014-05-23 08:55:37
【问题描述】:

我有以下疑问:

$queryResult = $this->Hit->query(
    "select P, count(S) as S
    from 
    (
        select pattern_id as P, srn as S from hits 
        where job_id=".$id." and srn != ''
        group by srn, pattern_id 
        order by pattern_id, srn
    ) as T 
        group by P
        order by P;"
);

所以基本上我有一个select .. from (select .. ) ... 声明。 当我使用 MySQL 时,它工作得很好。但是我必须将数据库迁移到 PostgreSQL,所以我想将其更改为 Cake-way。所以我的问题是,如何在 CakePHP 中解释这种类型的查询 (select from select)?

提前致谢。

【问题讨论】:

  • 您是否遇到任何错误或无法执行此查询?
  • 正如我所提到的,它现在正在工作。但是如果有这个选项,我想用“蛋糕”方式表达它,因为我会将整个数据库迁移到 PostgreSQL,我还没有检查这个 MySQL 查询是否可以在那里工作。所以我想使用类似$this->Hit->find(... 而不是$this->Hit->query(...
  • 在这里查看简单的子查询面包店:bakery.cakephp.org/articles/lucaswxp/2011/02/11/…
  • 谢谢,我已经检查过了。不幸的是,我仍然看不到如何使用子查询作为源表。在这种情况下,我应该在哪个模型上调用查找?还是应该将子查询添加到 find 方法的'table' 参数中?
  • 通常对于那种形式的查询,您使用查询。我不知道我是否误读了查询 - 您是否需要该查询结构?不能写成一个select语句吗?

标签: php mysql sql postgresql cakephp


【解决方案1】:

我不确定你在 CakePHP 中解释这个查询是什么意思,因为你的代码是有效的 CakePHP。

话虽如此,我会将您的查询重写为:

SELECT pattern_id as P, COUNT(DISTINCT srn) as S
FROM hits
WHERE job_id=".$id." and srn != ''
GROUP BY pattern_id
ORDER BY pattern_id;

(我相信这是等效的 - 您可以使用示例数据加载 sqlfiddle.com 以进行更好的测试)

如果可行并且您有 Hits 模型,那么您可以使用 find 方法重新编写查询。

【讨论】:

  • 我想用$this->find而不是$this->query来解释它。您编写的查询完美运行,谢谢!
  • 如果您添加了等效的 find 调用,那将是一个更好的答案。
猜你喜欢
  • 2016-02-25
  • 2022-01-13
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
相关资源
最近更新 更多