Cakephp INNER JOIN (ВЫБРАТЬ ...) - PullRequest
0 голосов
/ 06 июня 2019

Версия Cakephp: 3.5.

У меня есть таблица претензий .У проекта много претензий.Заявка имеет один проект, номер (1, 2, 3 и работает), и каждый номер может быть пересмотрен несколько раз.Комбинация project_id, number и rev_number делает уникальной заявку.Таблица выглядит примерно так (справа я пометил нужные строки в запросе):

+----+------------+--------+------------+---------+
| 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.

SQL-файл, который я хочу создать с помощью ORM, похож на

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 () или match () после изучения этого.

1 Ответ

0 голосов
/ 06 июня 2019

Как прокомментировал @ndm, используя join() или innerJoin() с queryObject ((sub) query), он работает.

$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();

OR

$query = $this->Claims->find()
            ->contain(['ClaimRows'])
            ->innerJoin(
                ['GroupedClaims' => $subq],
                ['GroupedClaims.number = Claims.number', 'GroupedClaims.latest = Claims.rev_number'])
            ->all();
...