【问题标题】:Nested query in Django ORMDjango ORM 中的嵌套查询
【发布时间】:2021-09-25 03:21:07
【问题描述】:

我正在尝试删除具有不同或注释的重复行,然后测量某些东西的计数。(mysql:8,django:2.2)

sql

select t1.cp_id, count(*) from (
    SELECT user_id, product_id, cp_id, count(*) as cnt FROM A 
    where created_at between '2021-07-12' and '2021-07-13'
    group by user_id, product_id, cp_id
) as t1
group by t1.cp_id

我的查询集

A.objects.filter(
    created_at__gte='2021-07-12',
    created_at__lt='2021-07-13'
).values('cp_id', 'user_id', 'product_id').annotate(cnt=Count('cp_id')).values('cp_id').annotate(count=Count('cp_id'))

这个查询集 sql

SELECT A.cp_id, COUNT(cp_id`) AS count FROM A 
WHERE (
created_at >= 2021-07-11 19:30:00 AND
 created_at < 2021-07-12 19:30:00 AND
)
GROUP BY cp_id, created_at
ORDER BY created_at ASC

我很困惑为什么 Django 会忽略我的命令顺序并在原始表(而不是删除重复数据的表)上执行最后一个查询命令

感谢您有解决方案或想法删除具有相同 'cp_id'、'user_id'、'product_id' 的行(不是从数据库中),然后计算每个 cp_id 的重复次数

我的模型.py

class A(models.Model):
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    cp = models.ForeignKey(CP, on_delete=models.CASCADE)
    created_at = models.DateTimeField()

【问题讨论】:

  • 只需要确认一件事你为什么要使用两次计数的注释来为cp_id?
  • @OpticPython 因为我想确保在我的计算中我的产品只计算一次('cp_id'、'user_id'、'product_id'、'created_at')然后我发现每天销售多少 cp 产品。每个 ('cp_id', 'user_id', 'product_id', 'created_at') 表中可能有几行
  • 你厌倦了下面的查询吗?

标签: python mysql django database orm


【解决方案1】:

试试这个查询:

A.objects.filter(
    created_at__range=[2021-07-12, 2021-07-14],
).annotate(cp_count=Count('cp_id')).values('cp_count', 'user_id', 'product_id', 'created_at').order_by('created_at')

【讨论】:

  • 感谢您告诉我的解决方案。但它仍然没有涵盖我查询的第二部分。删除重复行后,我想知道每个cp的产品数量
  • 如果能分享models.py就更好了,我可以帮助你。
  • 我将我的模型添加到问题中:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多