有一个简单的SQL表,其中包含3列:id,sku,last_update 和一个非常简单的SQL语句:SELECT DISTINCT sku FROM product_data ORDER BY last_update ASC
上述SQL语句的django视图代码是什么?
此代码:
q = ProductData.objects.values('sku').distinct().order_by('sku')
返回145个结果
此语句:
q = ProductData.objects.values('sku').distinct().order_by('last_update')
返回1000多个结果
为什么会这样?有人可以帮忙吗?
非常感谢!
答案 0 :(得分:2)
区别在于,在第一个查询中,结果是(sku
)s的列表,在第二个查询中是({{11}},sku
)s的列表,这是因为last_update
中包含的所有字段也都包含在SQL order_by
中,因此将distinct应用于不同的集或记录,从而产生不同的计数。
看看Django生成的查询,它们应该类似于以下内容:
查询#1
SELECT
查询#2
>>> str(ProductData.objects.values('sku').distinct().order_by('sku'))
'SELECT DISTINCT "yourproject_productdata"."sku" FROM "yourproject_productdata" ORDER BY "yourproject_productdata"."sku" ASC'
中对此行为进行了描述
在SELECT_BY()调用中使用的任何字段都包含在SQL SELECT中 列。在以下情况下使用有时会导致意外结果 与distinct()结合使用。如果您按相关领域中的字段排序 模型,这些字段将添加到所选列中, 否则,重复的行似乎是不同的。由于额外 列不会出现在返回的结果中(它们仅用于 支持排序),有时结果似乎不明显 被退回。
类似地,如果您使用values()查询来限制列 选中,则在任何order_by()(或默认模型)中使用的列 订单)仍然会涉及到,并且可能会影响 结果。
这里的道义是,如果您使用distinct(),请注意 按相关模型排序。同样,当使用distinct()和 values()一起使用时,请注意不在字段中排序时 values()调用。