2016-10-10 7 views
0

さて、イベントと同様の2つのモデルがあります。イベントモデルには、特定のビジネスオブジェクトにリンクする「ビジネス」フィールドがあり、それにはさらに「マネージャー」フィールドがあります。また、イベントモデルには、イベントが発生する日付を記述する "when"フィールドがあります。
Likeモデルでは、特定のイベントオブジェクトにリンクする「イベント」フィールドと、誰が好きなのか、そのイベントに与えられたのかを記述する「人物」と「日付」フィールドもあります。クエリ内の複雑な条件付き順序付け

目標は、対象となるユーザーがお気に入りのイベントをすべてユーザーページに表示し、そのユーザーがすべてのイベントを表示するようになりました。結果は、すでに述べたようで、「日付」と「とき」イベントモデルにおけるによって、ソートされなければならないという問題が来て、

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); 

しかし:単に、このSQLコマンドを使用して行うことができます。イベントオブジェクトがLikeオブジェクトから派生している場合、Likeオブジェクトの "date"でソートする必要があります。それ以外の場合は、イベントの "when"でソートする必要があります。
ソートが挿入されると、このクエリはより複雑になると思います。だから誰も適切な解決策を知っていますか?私はCASE WHENまたは同等のannotateコマンドをDjango ORMで使用すべきだと思いますが、どのように正確にはわかりません。

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にそれを翻訳するために、私はそれについて別の質問を投稿すると思う...編集:苦労の一日は、私はそれを動作させるために、最終的に管理した後

+1

サンプルデータと望ましい結果は、あなたがしたいことを説明するのに役立ちます。 –

+0

私がやっているのは、ユーザが自分が作成した他のものと好きなすべてのイベントが混在しているユーザページに表示されるデータを準備することなので、わかりやすいと思います。そして私は、イベントモデルで日付(Likeモデル)と「when」日付でソートすることに問題があります。 – MikiSoft

+2

@MikiSoft必要なものを知っている人にとっては、もっとシンプルですが、私たちのほとんどは、データの説明よりもデータの理解が容易です。あなたの問題については、 'event.id IN()'を使うのではなく、 'like'テーブルのクエリに別の' JOIN'(または 'LEFT JOIN')を追加する必要があります。これは、必要なフィールドにアクセスできるようにするためです並べ替えのためのもの: 'ORDER BY CASE WHEN like.person_id IS NULL THEN event.date ELSE like.date END' –

答えて