2010-04-23 31 views
0

在我的forum_threads表中獲得3行後,這不再是它的工作。這是組織一個活躍的論壇主題列表,並將最近回覆的線程放在列表頂部,然後是第二個最近發佈的線程,然後是第三個,第四個等。MySQL子查詢..在3個表項後沒有提供正確的信息

像我一樣說,查詢工作奇蹟,直到有第四行添加到forum_threads

SELECT 
    forum_threads.*, 
    forum_posts.thread_id 
FROM 
    forum_threads 
    INNER JOIN (
     SELECT MAX(id) AS id, thread_id as thread_id 
     FROM forum_posts 
    GROUP BY thread_id 
    ORDER BY id DESC 
) forum_posts ON forum_threads.id = forum_posts.thread_id 
+0

你是什麼意思的「不再是它的工作」?它不會返回所有行嗎? – a1ex07 2010-04-23 19:49:58

回答

1

乍一看,您的查詢看起來沒問題。有時,它有助於嘗試同樣的事情不同,以發現錯誤,因此檢查一下下面爲您提供:

SELECT 
    (SELECT MAX(id) FROM forum_posts WHERE thread_id = t.id) max_post_id, 
    t.id 
FROM 
    forum_threads t 
ORDER BY 
    max_post_id DESC 

forum_posts添加複合指數超過(thread_id, id)

+0

雖然SELECT子句需要't.id作爲thread_id,t。*'來匹配發布者的原始查詢,這當然可以工作。它也可能比子查詢連接慢,但並不明顯;對實際數據的基準將是有序的。 – eswald 2010-04-23 20:23:36

+0

您對列名稱是正確的。複製/粘貼錯誤,我會修復它。如果有索引,我希望最差的時候可以忽略不計的性能損失。 – Tomalak 2010-04-23 20:32:46

1

你似乎依靠MySQL來按照與內部查詢相同的順序排序外部查詢,而沒有真正指定你想要的內容。嘗試將ORDER BY子句移動到外部查詢:

SELECT 
    forum_threads.*, 
    forum_posts.thread_id 
FROM 
    forum_threads 
    INNER JOIN (
    SELECT MAX(id) AS id, thread_id as thread_id 
     FROM forum_posts 
    GROUP BY thread_id 
) forum_posts ON forum_threads.id = forum_posts.thread_id 
ORDER BY forum_posts.id DESC 
+0

+1可能就是這樣。 – Tomalak 2010-04-23 20:20:44