我有一个模式,“市场”,其具有一到许多相对于另一模型,“合同”:

class Market(models.Model):
    name = ...
    ...

class Contract(models.Model):
    name= ...
    market = models.ForeignKey(Market, ...)
    current_price = ...

我想与每个的最大价格合同沿着取市场对象。这是我想通过原始SQL做到这一点:

SELECT M.id as market_id, M.name as market_name, C.name as contract_name, C.price 
as price from pm_core_market M INNER JOIN
    (SELECT market_id, id, name, MAX(current_price) as price 
        FROM pm_core_contract GROUP BY market_id) AS C
ON M.id = C.market_id

有没有办法实现这个没有使用SQL的方式?如果存在,其中之一应在性能方面优选?

有帮助吗?

解决方案

的Django 1.1(目前测试版)添加聚合以支撑数据库API。您的查询可以这样做:

from django.db.models import Max, F

Contract.objects.annotate(max_price=Max('market__contract__current_price')).filter(current_price=F('max_price')).select_related()

此生成以下SQL查询:

SELECT contract.id, contract.name, contract.market_id, contract.current_price, MAX(T3.current_price) AS max_price, market.id, market.name
FROM contract LEFT OUTER JOIN market ON (contract.market_id = market.id) LEFT OUTER JOIN contract T3 ON (market.id = T3.market_id)
GROUP BY contract.id, contract.name, contract.market_id, contract.current_price, market.id, market.name
HAVING contract.current_price =  MAX(T3.current_price)

在API使用一个额外的加入,而不是一个子查询(如查询一样)。这是很难分辨出哪查询速度更快,尤其是在不知道数据库系统。我建议你做一些基准,并决定。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top