Django: Как я могу явно сделать запрос с предложением HAVING? - PullRequest
2 голосов
/ 18 августа 2010

Мне нужно выполнить некоторый SQL, который выглядит следующим образом:

select approve_firm_id,approve_dt,approve_result 
from main_approve 
group by approve_firm_id 
having MAX(approve_dt) and approve_result=0;

it выполняет (mysql-5.1), но если я попытаюсь в модели Django, как это:

Approve.objects.annotate(max_dt=Max('approve_dt')).
   filter(max_dt__gt=0).filter(approve_result=0).query

Сгенерированный запрос выглядит так:

SELECT `main_approve`.`id`, `main_approve`.`approve_result`,
`main_approve`.`approve_dt`, `main_approve`.`approve_user_id`,
`main_approve`.`approve_firm_id`, `main_approve`.`exported_at`,
MAX(`main_approve`.`approve_dt`) AS `max_dt` FROM `main_approve` 
WHERE (`main_approve`.`approve_result` = 0 ) 
GROUP BY `main_approve`.`id` 
HAVING MAX(`main_approve`.`approve_dt`) > 0
ORDER BY NULL

Мне нужно, чтобы предложение WHERE было ПОСЛЕ предложение GROUP BY.

1 Ответ

0 голосов
/ 18 августа 2010

SQL вообще работает? Часть having MAX(approve_dt) определенно выглядит подозрительно. Возможно, вы имеете в виду это:

SELECT DISTINCT
    main_approve.approve_firm_id,
    main_approve.approve_dt,
    main_approve.approve_result
FROM
    main_approve
    JOIN (
        SELECT 
            approve_firm_id,
            MAX(approve_dt) AS max_dt
        FROM
            main_approve
        GROUP BY 
            approve_firm_id
    ) AS t
    ON
        main_approve.approve_firm_id = t.approve_firm_id
        AND main_approve.approve_dt = t.max_dt
WHERE
    main_approve.approve_result = 0;

Будет проще построить выражение ORM после того, как вы точно поймете, каким будет SQL.

...