查询中的复杂条件排序
Complex conditional ordering in a query
好的,所以有两个模型 - 事件和点赞。事件模型有 "business" 字段链接到特定的业务对象,它进一步有 "manager" 字段。此外,事件模型具有 "when" 字段,用于描述事件发生的日期。
另一方面,Like 模型有 "event" 字段链接到特定的 Event 对象,还有 "person" 和 "date" 字段描述谁给了 like 以及给那个事件的时间。
现在的目标是在用户页面上显示目标用户喜欢的所有活动,以及经理是该用户的所有活动。可以简单地用这个 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" 中的 Like 和 "when" 中的 Event 模型。排序行为应如下所示:如果 Event 对象派生自 Like 对象,则应在该 Like 对象中按 "date" 排序,否则应在 Event 中按 "when" 排序。
我认为一旦在那里插入排序,这个查询就会变得更加复杂,所以有人知道正确的解决方案吗?我想应该使用 Django ORM 中的 CASE WHEN
或等效的 annotate
命令,但我不知道具体如何。
P.S。我不介意它是用纯 SQL 还是用 Django ORM 写的,只要能解决问题就行。提前致谢!
经过一整天的努力,我终于成功了:
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,我想我会 post 关于那个的另一个问题...编辑:
好的,所以有两个模型 - 事件和点赞。事件模型有 "business" 字段链接到特定的业务对象,它进一步有 "manager" 字段。此外,事件模型具有 "when" 字段,用于描述事件发生的日期。
另一方面,Like 模型有 "event" 字段链接到特定的 Event 对象,还有 "person" 和 "date" 字段描述谁给了 like 以及给那个事件的时间。
现在的目标是在用户页面上显示目标用户喜欢的所有活动,以及经理是该用户的所有活动。可以简单地用这个 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" 中的 Like 和 "when" 中的 Event 模型。排序行为应如下所示:如果 Event 对象派生自 Like 对象,则应在该 Like 对象中按 "date" 排序,否则应在 Event 中按 "when" 排序。
我认为一旦在那里插入排序,这个查询就会变得更加复杂,所以有人知道正确的解决方案吗?我想应该使用 Django ORM 中的 CASE WHEN
或等效的 annotate
命令,但我不知道具体如何。
P.S。我不介意它是用纯 SQL 还是用 Django ORM 写的,只要能解决问题就行。提前致谢!
经过一整天的努力,我终于成功了:
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,我想我会 post 关于那个的另一个问题...编辑: