【发布时间】:2016-02-14 10:11:39
【问题描述】:
我正在尝试执行 MySQL 查询以查找网络论坛中最近活跃的线程(以及每个线程的最新评论)。线程存储在两个表中,forum_topics 和forum_responses,其中每个forum_topic 有许多forum_responses。
在这里,我在forum_reponses 和forum_topics 上进行搜索,对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 进行分组的,但与直觉相反,我们没有按照最近的活动对论坛主题进行排序,并且相关的论坛回复也不是最新的。
这里出了什么问题?有没有办法更改此查询,以便我获得最近参与论坛主题的列表,以及它们各自最近的 cmets?
【问题讨论】:
-
如果我正确理解了您的目标...您需要在子查询中分组以获取每个主题的最新响应 ID,然后将其加入响应以获取正文回应。
-
您按主题 ID 分组。因此,每个主题都会得到一个结果行。现在让我们看看你展示了什么:它的 ID、它的标题、它的响应 ID 之一、它的响应主体之一。您可以按照每个主题任意选择的响应 ID 对结果进行排序。为什么它只是主题响应 ID 和正文之一?因为你没有告诉 DBMS 你想要哪一个。 (但不可否认,在 MySQL 中要告诉它并不容易)。
-
您说要显示最新的主题,但您似乎要显示所有个主题,每个主题都有其最新的响应。或不?你到底想要什么?
-
@Gordon Linoff:我想你在这里误解了 Uueerdo。如果 schnauss 实际上想要所有主题及其最新响应,您可以通过查找每个主题的最新响应 id(在派生表查询中)来解决此问题,然后使用这些来访问响应记录。
-
@GordonLinoff 我没有在子查询中提及 ordering ;我是说 grouping 必须合二为一。 Thorston 更好地理解和阐述。
标签: mysql sql sorting group-by