将MySql查询转换为Django ORM查询

罗密欧(Romeo Mihalcea)

我在MySql中有一个查询,需要将其翻译为Django ORM。它涉及联接两个表,其中一个表具有两个计数。我在Django中非常接近它,但是得到了重复的结果。这是查询:

SELECT au.id, 
       au.username, 
       COALESCE(orders_ct, 0) AS orders_ct, 
       COALESCE(clean_ct, 0)  AS clean_ct, 
       COALESCE(wash_ct, 0)   AS wash_ct 
FROM   auth_user AS au 
       LEFT OUTER JOIN 
           ( SELECT user_id,
                    Count(*)  AS orders_ct                    
             FROM   `order`
             GROUP  BY user_id
           ) AS o 
                    ON au.id = o.user_id 
       LEFT OUTER JOIN  
           ( SELECT user_id,
                    Count(CASE WHEN service = 'clean' THEN 1 
                          END)  AS clean_ct,
                    Count(CASE WHEN service = 'wash' THEN 1 
                          END)  AS wash_ct                            
             FROM   job
             GROUP  BY user_id
           ) AS j
                    ON au.id = j.user_id 
ORDER  BY au.id DESC 
LIMIT  100 ;

我当前的Django查询(该查询会带来不必要的重复):

User.objects.annotate(
    orders_ct = Count( 'orders', distinct = True )
).annotate(
    clean_ct = Count( Case(
        When( job__service__exact = 'clean', then = 1 )
    ) )
).annotate(
    wash_ct = Count( Case(
        When( job__service__exact = 'wash', then = 1 )
    ) )
)

上面的Django代码产生以下查询,该查询接近但不正确:

SELECT DISTINCT `auth_user`.`id`, 
                `auth_user`.`username`, 
                Count(DISTINCT `order`.`id`) AS `orders_ct`, 
                Count(CASE 
                        WHEN `job`.`service` = 'clean' THEN 1 
                        ELSE NULL 
                      end)                   AS `clean_ct`, 
                Count(CASE 
                        WHEN `job`.`service` = 'wash' THEN 1 
                        ELSE NULL 
                      end)                   AS `wash_ct` 
FROM   `auth_user` 
       LEFT OUTER JOIN `order` 
                    ON ( `auth_user`.`id` = `order`.`user_id` ) 
       LEFT OUTER JOIN `job` 
                    ON ( `auth_user`.`id` = `job`.`user_id` ) 
GROUP  BY `auth_user`.`id` 
ORDER  BY `auth_user`.`id` DESC 
LIMIT  100 

我可能可以通过执行一些原始的sql子查询来实现,但我希望尽可能保持抽象。

vsd

根据此答案,您可以编写:

User.objects.annotate(
    orders_ct = Count( 'orders', distinct = True ),
    clean_ct = Count( Case(
        When( job__service__exact = 'clean', then = F('job__pk') )
    ), distinct = True ),
    wash_ct = Count( Case(
        When( job__service__exact = 'wash', then = F('job__pk') )
    ), distinct = True )
)

表(加入后):

user.id  order.id  job.id  job.service  your case/when  my case/when
1        1         1       wash         1               1
1        1         2       wash         1               2
1        1         3       clean        NULL            NULL
1        1         4       other        NULL            NULL
1        2         1       wash         1               1
1        2         2       wash         1               2
1        2         3       clean        NULL            NULL
1        2         4       other        NULL            NULL

的期望输出为wash_ct2。计算中的不同值my case/when,我们将得到2。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将mysql查询转换为Django模型的ORM?

来自分类Dev

如何将查询转换为 django ORM 查询

来自分类Dev

Django 将 MySQL 查询转换为 Django 查询

来自分类Dev

如何将SQL查询转换为Django ORM

来自分类Dev

将SQL查询表单转换为Django ORM

来自分类Dev

将SQL查询转换为ORM Odoo

来自分类Dev

将MySQL查询转换为休眠查询

来自分类Dev

将mysql查询转换为JPQL查询

来自分类Dev

将MySql查询转换为MSSql查询

来自分类Dev

将mysql查询转换为laravel查询

来自分类Dev

将MySQL查询转换为BigQuery查询

来自分类Dev

将 MySQL 查询转换为 Laravel 查询

来自分类Dev

将 mysql 查询转换为 Laravel 查询

来自分类Dev

简化Django ORM查询

来自分类Dev

Django ORM特定查询

来自分类Dev

Django ORM查询

来自分类Dev

Django ORM JOIN查询

来自分类Dev

Django 中的 orm 查询

来自分类Dev

如何将此 SQL 查询转换为 Django ORM 语句?

来自分类Dev

如何将查询转换为Laravel雄辩的ORM

来自分类Dev

将LEFT OUTER JOIN查询转换为Django ORM queryset / query

来自分类Dev

在django ORM中查询时,如何将char转换为整数?

来自分类Dev

使用多个连接将原始 SQL 查询转换为 Django ORM

来自分类Dev

无法将SQL查询转换为Django

来自分类Dev

将MySQL查询转换为CI语法

来自分类Dev

将MySql查询转换为CakePhp 2.0

来自分类Dev

将mysql查询转换为MS SQL

来自分类Dev

将Mysql查询转换为Elastic Search

来自分类Dev

将MySQL查询转换为cakephp条件