2010-08-18 2 views
2

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

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

это работает (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.

+0

Mike Atlas, спасибо за исправление, но я имел в виду «Мне нужно, чтобы предложение WHERE было __AFTER__ предложением GROUP BY», поскольку оно действительно выполняется раньше. –

ответ

0

Работает ли 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 будет.

+0

Он делает! Кроме того, он работает так, как я хочу. Скажем, у нас есть ROW1 [approve_firm_id = 1 approve_result = 1 approve_dt = сегодня] и ROW2 [approve_firm_id = 1 approve_result = 0 approve_dt = вчера] Мой (и ваш) SQL запуска правильно - нет approve_firm_id = 1, потому что сегодняшний Approve = 1 Другой, сгенерированный Django, сортирует __before__ и возвращает строку с approve_firm_id = 1 –

+0

Этот SQL определенно не работает в PostgreSQL. Какой сервер баз данных вы используете? MySQL? В любом случае, поскольку предложение HAVING должно принимать только логическое выражение, даже если SQL работает на сервере базы данных, я не думаю, что Django ORM может генерировать тот же SQL. Вы пытались переписать выражение ORM на основе SQL, который я разместил вместо этого? – sayap

 Смежные вопросы

  • Нет связанных вопросов^_^