Cakephp 内部连接(SELECT ...)
Cakephp INNER JOIN (SELECT ... )
Cakephp 版本:3.5.
我有一个索赔table。一个项目有很多要求。一个claim有一个project,一个number(1,2,3 and 运行),每个number可以修改多次。 project_id、数字和 rev_number 的组合构成了独特的声明。 Table 看起来像这样(在右侧我标记了查询中我想要的行):
+----+------------+--------+------------+---------+
| id | project_id | number | rev_number | i want |
+----+------------+--------+------------+---------+
| 1 | 2 | 1 | 1 | |
+----+------------+--------+------------+---------+
| 2 | 1 | 1 | 1 | <- this |
+----+------------+--------+------------+---------+
| 3 | 1 | 2 | 1 | |
+----+------------+--------+------------+---------+
| 4 | 1 | 3 | 1 | |
+----+------------+--------+------------+---------+
| 5 | 1 | 2 | 2 | |
+----+------------+--------+------------+---------+
| 6 | 1 | 2 | 3 | <- this |
+----+------------+--------+------------+---------+
| 7 | 1 | 3 | 2 | <- this |
+----+------------+--------+------------+---------+
所以我想要每个索赔编号的最新版本(最高 rev_number),其中 project_id = 1。
我想用ORM生成的sql是这样的
SELECT Claims.*
FROM claims Claims
INNER JOIN (
SELECT number, MAX(rev_number) AS latest
FROM claims
WHERE project_id = 1
GROUP BY number) AS GroupedClaims
ON GroupedClaims.number = Claims.number
AND GroupedClaims.latest = Claims.rev_number;
这个sql如何用ORM生成? INNER JOIN (SELECT ... )
是怎么产生的?在调查之后,我找不到 join()、innerJoin()、innerJoinWith() 或 matching() 的解决方案。
正如@ndm 所评论的那样,通过将 join()
或 innerJoin()
与 queryObject((子)查询)一起使用,它有效。
$subq = $this->Claims->find()
->select(['number' => 'Claims.number', 'latest' => 'MAX(Claims.rev_number)'])
->where(['project_id' => $pid])
->group(['number']);
和
$query = $this->Claims->find()
->contain(['ClaimRows'])
->join([
'GroupedClaims' => [
'table' => $subq,
'type' => 'INNER',
'conditions' => ['GroupedClaims.number = Claims.number', 'GroupedClaims.latest = Claims.rev_number']
]
])
->all();
或
$query = $this->Claims->find()
->contain(['ClaimRows'])
->innerJoin(
['GroupedClaims' => $subq],
['GroupedClaims.number = Claims.number', 'GroupedClaims.latest = Claims.rev_number'])
->all();
Cakephp 版本:3.5.
我有一个索赔table。一个项目有很多要求。一个claim有一个project,一个number(1,2,3 and 运行),每个number可以修改多次。 project_id、数字和 rev_number 的组合构成了独特的声明。 Table 看起来像这样(在右侧我标记了查询中我想要的行):
+----+------------+--------+------------+---------+
| id | project_id | number | rev_number | i want |
+----+------------+--------+------------+---------+
| 1 | 2 | 1 | 1 | |
+----+------------+--------+------------+---------+
| 2 | 1 | 1 | 1 | <- this |
+----+------------+--------+------------+---------+
| 3 | 1 | 2 | 1 | |
+----+------------+--------+------------+---------+
| 4 | 1 | 3 | 1 | |
+----+------------+--------+------------+---------+
| 5 | 1 | 2 | 2 | |
+----+------------+--------+------------+---------+
| 6 | 1 | 2 | 3 | <- this |
+----+------------+--------+------------+---------+
| 7 | 1 | 3 | 2 | <- this |
+----+------------+--------+------------+---------+
所以我想要每个索赔编号的最新版本(最高 rev_number),其中 project_id = 1。
我想用ORM生成的sql是这样的
SELECT Claims.*
FROM claims Claims
INNER JOIN (
SELECT number, MAX(rev_number) AS latest
FROM claims
WHERE project_id = 1
GROUP BY number) AS GroupedClaims
ON GroupedClaims.number = Claims.number
AND GroupedClaims.latest = Claims.rev_number;
这个sql如何用ORM生成? INNER JOIN (SELECT ... )
是怎么产生的?在调查之后,我找不到 join()、innerJoin()、innerJoinWith() 或 matching() 的解决方案。
正如@ndm 所评论的那样,通过将 join()
或 innerJoin()
与 queryObject((子)查询)一起使用,它有效。
$subq = $this->Claims->find()
->select(['number' => 'Claims.number', 'latest' => 'MAX(Claims.rev_number)'])
->where(['project_id' => $pid])
->group(['number']);
和
$query = $this->Claims->find()
->contain(['ClaimRows'])
->join([
'GroupedClaims' => [
'table' => $subq,
'type' => 'INNER',
'conditions' => ['GroupedClaims.number = Claims.number', 'GroupedClaims.latest = Claims.rev_number']
]
])
->all();
或
$query = $this->Claims->find()
->contain(['ClaimRows'])
->innerJoin(
['GroupedClaims' => $subq],
['GroupedClaims.number = Claims.number', 'GroupedClaims.latest = Claims.rev_number'])
->all();