2016-10-10 44 views
0

好吧,所以有兩個模型 - 事件和類似。事件模型具有鏈接到特定業務對象的「業務」字段,其還具有「經理」字段。此外,事件模型具有「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' –

回答

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.