Сложный условный порядок в запросе

Итак, есть две модели - Event и 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);

Но возникает проблема, когда эти результаты должны быть отсортированы по уже упомянутой «дате» в модели «Нравится» и «когда» в модели события. Поведение при сортировке должно быть следующим: если объект Event является производным от объекта Like, тогда он должен быть отсортирован по «дате» в этом объекте Like, в противном случае он должен быть отсортирован по «когда» в Event.
Я думаю, что этот запрос будет намного сложнее, если в него будет вставлена ​​сортировка, так что кто-нибудь знает правильное решение? Я полагаю, что следует использовать CASE WHEN или эквивалентную annotate команду в Django ORM, но я не знаю, как именно.

P.S. Я не возражаю, если он написан на чистом SQL или в Django ORM, если он решает проблему. Заранее спасибо!


person softzer0    schedule 10.10.2016    source источник
comment
Образцы данных и желаемые результаты помогут объяснить, что вы хотите сделать.   -  person Gordon Linoff    schedule 10.10.2016
comment
Я думаю, что это довольно просто понять, потому что то, что я делаю, - это подготовка данных для отображения на странице пользователя, где смешиваются все события, которые понравились этому пользователю, с другими, которые он создал. И у меня проблема с их сортировкой по дате (модели типа) и дате в модели события.   -  person softzer0    schedule 10.10.2016
comment
@MikiSoft Человеку, который знает, чего он хочет, всегда проще, но большинству из нас легче понять данные, чем их описания. Что касается вашей проблемы, вы должны добавить еще один JOIN (или LEFT JOIN) в свой запрос для таблицы like вместо использования event.id IN(), потому что это даст вам доступ к полям, необходимым для сортировки ... что-то вроде: ORDER BY CASE WHEN like.person_id IS NULL THEN event.date ELSE like.date END   -  person Hart CO    schedule 10.10.2016
comment
@HartCO Спасибо! Мне удалось сформировать запрос по вашему предложению! Я отправлю ответ сейчас. :)   -  person softzer0    schedule 10.10.2016


Ответы (1)


После целого дня борьбы мне наконец удалось заставить его работать:

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, я думаю, что опубликую еще один вопрос по этому поводу ... Изменить: Да.

person softzer0    schedule 10.10.2016