gpt4 book ai didi

MySQL 分组不遵守 ORDER BY

转载 作者:可可西里 更新时间:2023-11-01 06:49:48 26 4
gpt4 key购买 nike

我正在尝试执行 MySQL 查询以查找网络论坛中最近活跃的线程(以及每个线程的最新评论)。主题存储在两个表中,forum_topicsforum_responses,其中每个 forum_topic 都有许多 forum_responses

在这里,我对连接到 forum_topicsforum_reponses 进行搜索,对 forum_response.id 进行降序排序:

select t.id, t.title, r.id, r.body 
from forum_responses r
inner join forum_topics t on (r.forum_topic_id = t.id)
order by r.id desc;

+----+--------------+----+----------------------------------+
| id | title | id | body |
+----+--------------+----+----------------------------------+
| 17 | New Topic | 69 | yes |
| 19 | Test Topic 1 | 68 | This is a test |
| 17 | New Topic | 64 | hey yo |
| 19 | Test Topic 1 | 63 | Test Topic Starter |
| 18 | Test Topic | 62 | Test. |
| 18 | Test Topic | 61 | Test |
| 17 | New Topic | 60 | Another test response. |
| 17 | New Topic | 59 | Test response. |
| 17 | New Topic | 54 | What should this topic be about? |
+----+--------------+----+----------------------------------+

好的,到目前为止一切顺利。但它返回重复项 - 我只想拥有最近响应的论坛主题。因此,我将 GROUP BY 添加到我的查询中,以便我们可以按主题 ID 进行分组:

select t.id, t.title, r.id, r.body 
from forum_responses r
inner join forum_topics t on (r.forum_topic_id = t.id)
group by t.id
order by r.id desc;

+----+--------------+----+----------------------------------+
| id | title | id | body |
+----+--------------+----+----------------------------------+
| 19 | Test Topic 1 | 63 | Test Topic Starter |
| 18 | Test Topic | 61 | Test |
| 17 | New Topic | 54 | What should this topic be about? |
+----+--------------+----+----------------------------------+

但现在,我们遇到了一个问题:它按论坛主题 ID 分组,但违反直觉的是,我们没有按照最近的事件对论坛主题进行排序,并且相关的论坛回复也不是最新的。

这里出了什么问题?有没有办法更改此查询,以便我获得最近贡献到论坛主题的列表,以及它们各自的最新评论?

最佳答案

这是我在最初的评论中提出的建议;你需要像这样单独分组:

SELECT t.id, t.title, r2.id, r2.body 
FROM (
SELECT forum_topic_id, MAX(id) AS lastResponseID
FROM forum_responses
GROUP BY forum_topic_id
) AS r
INNER JOIN forum_responses AS r2
ON r.forum_topic_id = r2.forum_topic_id AND r.lastResponseID = r2.id
INNER JOIN forum_topics AS t
ON r.forum_topic_id = t.id
ORDER BY t.id;

在子查询中包含 forum_topics(以及它的 title 字段)可能更快(能够更好地利用索引),但这在很大程度上取决于数据分布;加入数百万索引行(对他们主题的每一个响应)可能比相对较少的未索引行(对他们主题的最新响应)慢。

关于MySQL 分组不遵守 ORDER BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33682410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com