SQL查询以获取最后10个带有回复的主题
我有一个简单的论坛数据库,想写SQL查询得到 10个最后的主题,以及3张或更多独特海报的回复。 结果:主题线程名称|最后一条消息文本|用户名|日期 更新: 以下是我尝试过的: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
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;