0

私のdjangoアプリには、投稿/返信の関係があるモデルがあり、最新の返信の時間で投稿を並べ替えようとしています。または、返信がない場合は、独自のタイムスタンプです。これは私が今持っているものです:

threads = ConversationThread.objects.extra(select={'sort_date':
                                    """select case when (select count(*) from conversation_conversationpost 
                                    where conversation_conversationpost.thread_id = conversation_conversationthread.id) > 0 
                                    then (select max(conversation_conversationpost.post_date) 
                                    from conversation_conversationpost where conversation_conversationpost.thread_id = conversation_conversationthread.id) 
                                    else conversation_conversationthread.post_date end"""}).order_by('-sort_date')

うまくいきますが、これが最も簡潔で効率的な方法ではないという予感があります。より良い方法は何でしょうか?

4

2 に答える 2

0

相関サブクエリは遅いことで知られています。
ALEFT JOINは大幅に高速になる可能性があります (データの分布によって異なります)。

SELECT  t.*, COALESCE(p.max_post_date, t.post_date) AS sort_date
FROM    conversation_conversationthread t
LEFT    JOIN (
    SELECT thread_id, MAX(post_date) AS max_post_date
    FROM   conversation_conversationpost
    GROUP  BY thread_id
    ) p ON p.thread_id = t.id
ORDER   BY sort_date DESC;
于 2013-01-18T01:31:46.807 に答える
0
SELECT  *,
        (
        SELECT  COALESCE(MAX(cp.post_date), ct.post_date)
        FROM    conversation_conversationpost cp
        WHERE   cp.thread_id = ct.id
        ) AS sort_date
FROM    conversation_conversationthread ct
ORDER BY
        sort_date DESC
于 2013-01-17T22:02:10.377 に答える