SQL: Limit rows linked to each joined row

2019-07-21 17:35发布

I've certain situation that requires certain result set from MySQL query, let's see the current query first & then ask my question:

SELECT 
    thread.dateline AS tdateline, post.dateline AS pdateline, MIN(post.dateline)
    FROM thread AS thread
        LEFT JOIN post AS post ON(thread.threadid = post.threadid)
        LEFT JOIN forum AS forum ON(thread.forumid = forum.forumid)
    WHERE post.postid != thread.firstpostid
        AND thread.open = 1
        AND thread.visible = 1
        AND thread.replycount >= 1
        AND post.visible = 1
        AND (forum.options & 1)
        AND (forum.options & 2)
        AND (forum.options & 4)
        AND forum.forumid IN(1,2,3)
    GROUP BY post.threadid
    ORDER BY tdateline DESC, pdateline ASC

As you can see, mainly I need to select dateline of threads from 'thread' table, in addition to dateline of the second post of each thread, that's all under the conditions you see in the WHERE CLAUSE. Since each thread has many posts, and I need only one result per thread, I've used GROUP BY CLAUSE for that purpose.

This query will return only one post's dateline with it's related unique thread.

My questions are:

  1. How to limit returned threads per each forum!? Suppose I need only 5 threads -as a maximum- to be returned for each forum declared in the WHERE CLAUSE 'forum.forumid IN(1,2,3)', how can this be achieved.
  2. Is there any recommendations for optimizing this query (of course after solving the first point)?

Notes:

  • I prefer not to use sub-queries, but if it's the only solution available I'll accept it. Double queries not recommended. I'm sure there's a smart solution for this situation.
  • I'm using MySQL 4.1+, but if you know the answer for another engine, just share.

Appreciated advice in advance :)

1条回答
干净又极端
2楼-- · 2019-07-21 17:55

Maybe this SO question: "limit the number of rows to join to in mysql" or more precisely its pointer to How to select the first/least/max row per group in SQL could help.

It all comes down to subqueries though I think.

查看更多
登录 后发表回答