查询中的复杂条件排序

时间:2016-10-10 14:43:31

标签: sql django sorting sql-order-by django-orm

好的,所以有两种型号 - 活动和喜欢。事件模型有" business"链接到某个Business对象的字段,该对象还包含" manager"领域。此外,事件模型有"当"描述事件发生日期的字段 另一方面,Like模型有" event"链接到某个Event对象的字段,以及" person"和"日期"描述谁给予喜欢以及何时给予该事件的字段。

现在的目标是在用户页面上显示目标用户所有喜欢的事件,以及管理员是该用户的所有事件。可以使用此SQL命令完成它:

SELECT event.*
FROM event INNER JOIN 
     business
     ON (event.business_id = business.id)
WHERE ((event.id IN (SELECT event_id FROM 'like' WHERE person_id = 1)) OR business.manager_id = 1);

但是,当结果必须按照已经提到的" date"进行排序时会出现问题。在喜欢和"当"在事件模型中。排序行为应如下所示:如果Event对象派生自Like对象,那么它应按" date"排序。在那个Like对象中,在其他情况下,它应该按"当"在事件中。
我认为这种查询在插入排序后会更复杂,所以有人知道正确的解决方案吗?我想应该使用Django ORM中的CASE WHEN或等效annotate命令,但我不知道具体如何。

P.S。我不介意用纯SQL或Django ORM编写,只要它能解决问题。提前谢谢!

1 个答案:

答案 0 :(得分:0)

经过一整天的挣扎,我终于成功了:

SELECT event.*
FROM event
INNER JOIN
    business
    ON (event.business_id = business.id AND business.manager_id = 1)
LEFT JOIN
    'like'
    ON ('like'.event_id = event.id AND 'like'.person_id = 1)
ORDER BY COALESCE('like'.date, event.'when') DESC;

现在要把它翻译成Django ORM,我想我会发布另一个关于这个的问题...编辑:I did.