2010-04-23 49 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

相关问题