2016-10-10 5 views
0

Хорошо, поэтому есть две модели - Event и Like. Модель события имеет поле «бизнес», которое ссылается на определенный бизнес-объект, в котором также есть поле «менеджер». Кроме того, в модели событий есть поле «когда», которое описывает дату возникновения события.
С другой стороны, как у модели есть поле «событие», которое ссылается на определенный объект 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); 

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

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' –

ответ

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.

Смежные вопросы