查询中的复杂条件排序

问题描述:

好吧,所以有两个模型 - 事件和类似。事件模型具有链接到特定业务对象的“业务”字段,其还具有“经理”字段。此外,事件模型具有“when”字段,它描述事件发生的日期。
另一方面,Like模型具有链接到某个Event对象的“event”字段,以及描述谁给与该事件的时间和时间的“person”和“date”字段。查询中的复杂条件排序

目标是在用户页面上显示目标用户所有喜欢的事件以及所有管理员是该用户的事件。它可以与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); 

但是,当结果必须进行排序,通过已经在像提到的“日期”和“时间”在事件模式存在了一个问题。排序行为应该如下:如果Event对象从Like对象派生,那么它应该按Like对象中的“date”排序,而在其他情况下,它应该按Event中的“when”排序。
我认为一旦插入排序,这个查询会变得更加复杂,所以有谁知道正确的解决方案?我想应该使用Django ORM中的CASE WHEN或等效annotate命令,但我不知道具体如何。

P.S.我不介意它是用纯SQL还是用Django ORM编写的,只要它解决了这个问题。提前致谢!

+1

样本数据和期望的结果将有助于解释你想要做什么。 –

+0

我认为这很容易理解,因为我正在做的是准备一个数据在用户页面上显示,其中混合了用户喜欢的所有事件以及他创建的其他事件。我有一个类似日期(如模型)排序它们的问题,以及在事件模型中的“何时”日期。 – MikiSoft

+2

@MikiSoft对于知道自己想要什么的人来说,这总是更简单,但我们大多数人对数据的理解比数据描述更容易理解。至于你的问题,你应该添加另一个'JOIN'(或'LEFT JOIN')到'like'表的查询中,而不是使用'event.id IN()',因为这样可以访问必要的字段排序...类似于:'ORDER BY CASE WHEN like.person_id IS NULL THEN event.date ELSE like.date END' –

之后我挣扎了一整天终于设法使其工作:

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.