【问题标题】:Django: How do I explicitly make a query with a HAVING clause?Django:如何使用 HAVING 子句显式进行查询?
【发布时间】:2010-08-18 03:42:46
【问题描述】:

我需要执行一些如下所示的 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;

它运行(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 子句是 AFTER GROUP BY 子句。

【问题讨论】:

  • Mike Atlas,感谢您的纠正,但我的意思是“我需要 WHERE 子句成为 AFTER GROUP BY 子句”,因为它实际上之前运行过。

标签: sql django annotate having-clause


【解决方案1】:

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;

知道SQL到底是什么后,构造ORM表达式会更容易。

【讨论】:

  • 确实如此!此外,它按照我想要的方式运行。假设我们有 row1 [approve_firm_id = 1approve_result = 1approve_dt = today] 和 row2 [approve_firm_id=1approve_result = 0approve_dt =昨天] 我的(和你的)sql 运行正确 - 没有approve_firm_id=1,因为今天的approve = 1 另一个由 Django 生成的排序 before 并返回带有approv_firm_id=1的行
  • 那个 SQL 在 PostgreSQL 中绝对行不通。您使用的是什么数据库服务器? MySQL?无论如何,由于 HAVING 子句应该只接受布尔表达式,即使 SQL 确实在您的数据库服务器中工作,我认为 Django ORM 不可能生成相同的 SQL。您是否尝试过根据我发布的 SQL 重写 ORM 表达式?
猜你喜欢
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
相关资源
最近更新 更多