SQL查询以获取最后10个带有回复的主题

SQL查询以获取最后10个带有回复的主题,sql,database,Sql,Database,我有一个简单的论坛数据库,想写SQL查询得到 10个最后的主题,以及3张或更多独特海报的回复。 结果:主题线程名称|最后一条消息文本|用户名|日期 更新: 以下是我尝试过的: SELECT thread.thread_id, thread.thread_name, message.thread_id, COUNT(message.thread_id) FROM thread, message WHERE message.thread_id = thread.thread_id GROUP

我有一个简单的论坛数据库,想写SQL查询得到 10个最后的主题,以及3张或更多独特海报的回复。 结果:主题线程名称|最后一条消息文本|用户名|日期

更新: 以下是我尝试过的:

SELECT thread.thread_id, thread.thread_name, message.thread_id, 
COUNT(message.thread_id) 
FROM thread, message
WHERE message.thread_id = thread.thread_id
GROUP BY message.thread_id
HAVING COUNT(message.thread_id) >= 3
LIMIT 10
但它返回10个主题线程,其中包含3个或更多回复,而不是3个或更多独特的海报

更新2:

SELECT message.thread_id AS ID, thread.thread_name AS topic
FROM message INNER JOIN thread
ON message.thread_id = thread.thread_id
GROUP BY message.thread_id
HAVING COUNT(*) >= 3
LIMIT 10
这还会返回10个主题,其中包含3个或更多回复

更新3,谢谢@shawnt00

SELECT thread.thread_name AS 'Topic', message_text AS 'Message', person_nickname AS 'Nickname', message_date AS 'Date'
FROM thread,
(
    SELECT thread.thread_id, MAX(message_date) AS last_date
    FROM thread 
    INNER JOIN message ON message.thread_id = thread.thread_id
    GROUP BY thread.thread_id
    HAVING COUNT(DISTINCT message.person_id) >= 3
) AS temp
INNER JOIN message
ON message.thread_id = temp.thread_id AND message.message_date = temp.last_date
INNER JOIN person ON person.person_id = message.person_id
WHERE thread.thread_id = temp.thread_id
ORDER BY message.message_date DESC
LIMIT 10

我想你需要下面的查询。 假设您使用的是mysql,所以我使用了Limitfunction,因为您希望最后3行是唯一的

        select distinct th.thread_name as Topic_name,  m.message_text,  p.person_nickname as User_name, m.message_date as Date from message m
            inner join thread th on m.thread_id=th.thread_id
            inner join persion p on p.persion_id=m.persion_id
order by message_date  desc
      Limit 3
但如果数据库是SQLSERVER,则使用下面的查询

      select distinct TOP(3) th.thread_name as Topic_name,  m.message_text,  p.person_nickname as User_name, m.message_date as Date from message m
            inner join thread th on m.thread_id=th.thread_id
            inner join persion p on p.persion_id=m.persion_id
order by message_date  desc

唯一的假设是在日期上不能有联系。如果您有可用的分析函数,那么还有其他使用这些函数的方法。我相信您可以找到如何获得前10名。

请以文本形式提供一些真实数据。是SQL Server吗?MySQL?请编辑您的问题并添加您解决问题的最佳尝试。请问,什么是主题?它不在您的数据模型中。哦,对不起,主题是一条线。非常感谢,它很有效!我对您的代码进行了一些编辑,使其能够与MySQL一起工作。是否可以优化表,只留下字段:线程名称、消息文本、人员昵称、消息日期?@SgtMaddonut当然,只列出要返回的列,而不是*。
with data as (
    select p.thread_id, max(message_date) as last_date
    from thread t inner join message m on m.thread_id = t.thread_id
    group by p.thread_id
    having count(distinct m.person_id) >= 3
)
select *
from data d
    inner join message m
        on m.thread_id = d.thread_id and m.message_date = m.last_date
    inner join person p on p.person_id = m.person_id;