通过ForeignKey外部引用对带有过滤器的子查询进行了汇总

弗雷德里克

我尝试从该SQL查询中编写等效的Django查询代码,但我遇到了麻烦。欢迎任何帮助。我收到了一场比赛id,从这个比赛中我想做一些统计:nb_race=给出比赛之前一匹马的比赛数量,best_chrono=给出比赛之前一匹马的最佳时间。

SELECT *, (SELECT count(run.id)
                FROM runner run
                INNER JOIN race
                ON run.race_id = race.id
                WHERE run.horse_id = r.horse_id
                AND race.datetime_start < rc.datetime_start 
                ) AS nb_race, 
          (SELECT min(run.chrono)
                FROM runner run
                INNER JOIN race
                ON run.race_id = race.id
                WHERE run.horse_id = r.horse_id
                AND race.datetime_start < rc.datetime_start 
                ) AS best_time
FROM runner r, race rc
WHERE r.race_id = rc.id
AND rc.id = 7890

Django模型:

class Horse(models.Model):
    id = AutoField(primary_key=True)
    name = models.CharField(max_length=255, blank=True, null=True, default=None)

class Race(models.Model):
    id = AutoField(primary_key=True)
    datetime_start = models.DateTimeField(blank=True, null=True, default=None)
    name = models.CharField(max_length=255, blank=True, null=True, default=None)

class Runner(models.Model):
    id = AutoField(primary_key=True)
    horse = models.ForeignKey(Horse, on_delete=models.PROTECT)
    race = models.ForeignKey(Race, on_delete=models.PROTECT)
    chrono = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True, default=None)
催眠师

子查询表达式可用于将其他查询集编译为依赖于主查询集的子查询,并将它们作为一个SQL一起执行。

from django.db.models import OuterRef, Subquery, Count, Min, F

# prepare a repeated expression about previous runners, but don't execute it yet
prev_run = (
    Runner.objects
    .filter(
        horse=OuterRef('horse'),
        race__datetime_start__lt=OuterRef('race__datetime_start'))
    .values('horse')
)
queryset = (
    Runner.objects
    .values('id', 'horse_id', 'race_id', 'chrono', 'race__name', 'race__datetime_start')
    .annotate(
        nb_race=Subquery(prev_run.annotate(nb_race=Count('id')).values('nb_race')),
        best_time=Subquery(prev_run.annotate(best_time=Min('chrono')).values('best_time'))
    )
)

链接的文档中介绍了此处使用的一些技巧

  • 子查询的输出字段必须限制.values(...)为一个字段:仅汇总值
  • 子查询必须是一个查询集(被评估为惰性并组合在一起),而不是一个值(将被立即评估并失败)。因此.annotate()用于子查询(不是.aggregate())。这会增加一个GROUP BY race.horse_id,但不是问题WHERE race.horse_id = ...,因为在现代数据库后端中,SQL优化器最终也会忽略“ group by”。

它被编译为与示例中的SQL等效的查询。检查SQL:

>>> print(str(queryset.query))
SELECT ...,
  (SELECT COUNT(U0.id)
   FROM runner U0 INNER JOIN race U1 ON (U0.race_id = U1.id)
   WHERE (U0.horse_id = runner.horse_id AND U1.datetime_start < race.datetime_start)
   GROUP BY U0.horse_id
   ) AS nb_race,
   ...
FROM runner INNER JOIN race ON (runner.race_id = race.id)

边际差异是子查询使用一些内部别名,例如U0和U1。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

雄辩的带有过滤器的复杂查询

来自分类Dev

带有过滤器的GetPivotData

来自分类Dev

带有过滤器的mdChips

来自分类Dev

Power Bi / Dax:汇总带有过滤器的表格

来自分类Dev

Swift中带有过滤器的高级Firebase查询

来自分类Dev

带有过滤器的ElasticSearch function_score查询

来自分类Dev

带有过滤器的AppEngine数据存储区查询从不返回结果(Go)

来自分类Dev

PHP Elasticsearch,带有过滤器的布尔查询未获得任何结果

来自分类Dev

弹性搜索 更像这个带有过滤器的查询是添加结果

来自分类Dev

带有过滤器的Spring数据ElastiSearch聚合

来自分类Dev

带有过滤器Elasticsearch的功能评分

来自分类Dev

Python Web抓取带有过滤器的表

来自分类Dev

带有过滤器的Django rest框架API

来自分类Dev

带有过滤器的Python BeautifulSoup抓取网站

来自分类Dev

带有过滤器的Spring数据ElastiSearch聚合

来自分类Dev

带有过滤器的淘汰嵌套的foreach

来自分类Dev

带有过滤器的Django URL模板

来自分类Dev

带有过滤器的 Rsyslog 加载模块

来自分类Dev

Dojo gridx过滤器:使用gridx过滤器时对服务器onkeypress进行了多次调用

来自分类Dev

g尾过滤器子页面通过ForeignKey

来自分类Dev

返回页面时,带有过滤器搜索页面的Flutter不断从查询中添加相同的列表视图

来自分类Dev

当执行参数化的N1QL查询时,Couchbase不使用带有过滤器的索引

来自分类Dev

汇总带有其他(不同)过滤器的列

来自分类Dev

ElasticSearch-带有过滤器的自定义分析器-未应用过滤器

来自分类Dev

SQL查询返回匹配任何或所有过滤器但不超过过滤器的行

来自分类Dev

ElasticSearch 5.1 带有多重过滤器的过滤查询

来自分类Dev

正则表达式所有带有过滤器的标签之间

来自分类Dev

如何在Django过滤器扩展中通过带有排除参数的查询集

来自分类Dev

CBasePin对拥有过滤器的增量引用。循环参考?

Related 相关文章

  1. 1

    雄辩的带有过滤器的复杂查询

  2. 2

    带有过滤器的GetPivotData

  3. 3

    带有过滤器的mdChips

  4. 4

    Power Bi / Dax:汇总带有过滤器的表格

  5. 5

    Swift中带有过滤器的高级Firebase查询

  6. 6

    带有过滤器的ElasticSearch function_score查询

  7. 7

    带有过滤器的AppEngine数据存储区查询从不返回结果(Go)

  8. 8

    PHP Elasticsearch,带有过滤器的布尔查询未获得任何结果

  9. 9

    弹性搜索 更像这个带有过滤器的查询是添加结果

  10. 10

    带有过滤器的Spring数据ElastiSearch聚合

  11. 11

    带有过滤器Elasticsearch的功能评分

  12. 12

    Python Web抓取带有过滤器的表

  13. 13

    带有过滤器的Django rest框架API

  14. 14

    带有过滤器的Python BeautifulSoup抓取网站

  15. 15

    带有过滤器的Spring数据ElastiSearch聚合

  16. 16

    带有过滤器的淘汰嵌套的foreach

  17. 17

    带有过滤器的Django URL模板

  18. 18

    带有过滤器的 Rsyslog 加载模块

  19. 19

    Dojo gridx过滤器:使用gridx过滤器时对服务器onkeypress进行了多次调用

  20. 20

    g尾过滤器子页面通过ForeignKey

  21. 21

    返回页面时,带有过滤器搜索页面的Flutter不断从查询中添加相同的列表视图

  22. 22

    当执行参数化的N1QL查询时,Couchbase不使用带有过滤器的索引

  23. 23

    汇总带有其他(不同)过滤器的列

  24. 24

    ElasticSearch-带有过滤器的自定义分析器-未应用过滤器

  25. 25

    SQL查询返回匹配任何或所有过滤器但不超过过滤器的行

  26. 26

    ElasticSearch 5.1 带有多重过滤器的过滤查询

  27. 27

    正则表达式所有带有过滤器的标签之间

  28. 28

    如何在Django过滤器扩展中通过带有排除参数的查询集

  29. 29

    CBasePin对拥有过滤器的增量引用。循环参考?

热门标签

归档