【发布时间】:2022-02-05 22:03:09
【问题描述】:
在查询中添加 HAVING 时,我遇到了一种看似正常的情况。 我读了here 和here,但对我没有帮助
我需要将 HAVING 添加到我的查询中
型号:
class Package(models.Model):
status = models.IntegerField()
class Product(models.Model):
title = models.CharField(max_length=10)
packages = models.ManyToManyField(Package)
产品:
|id|title|
| - | - |
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
包:
|id|status|
| - | - |
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 2 |
Product_Packages:
|product_id|package_id|
| - | - |
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
| 3 | 2 |
| 2 | 3 |
| 4 | 3 |
| 4 | 4 |
视觉
- pack_1 (A, B) 状态正常
- pack_2 (B, C) 状态不正常
- pack_3 (B, D) 状态正常
- pack_4 (D) 状态不正常
我的任务是选择那些 latest 包裹状态 = 1
的产品预期结果是:A、B
我的查询是这样的
SELECT prod.title, max(tp.id)
FROM "product" as prod
INNER JOIN "product_packages" as p_p ON (p.id = p_p.product_id)
INNER JOIN "package" as pack ON (pack.id = p_p.package_id)
GROUP BY prod.title
HAVING pack.status = 1
它返回的正是我所需要的
|title|max(pack.id)|
| - | - |
| A | 1 |
| B | 3 |
但是我的 orm 不能正常工作 我试试这样
p = Product.objects.values('id').annotate(pack_id = Max('packages')).annotate(my_status = F('packages__status')).filter(my_status=1).values('id', 'pack_id')
p.查询
选择 "product"."id", MAX("product_packages"."package_id") AS "pack_id"
FROM "product" 左外连接 "product_packages" ON ("product"."id" = "product_packages"."product_id") 左外连接 "package" ON ("product_packages"."package_id" = "package"."id ")
WHERE "package"."status" = 1
按“产品”分组。“id”
请帮我制作正确的 ORM
【问题讨论】: