Mysql 在联接表上使用分组依据时忽略排序依据
我正在尝试编写一个查询,以显示按最新发布日期排序的论坛线程列表 这是一个从数据库获取数据的非常简单的过程,但是由于Mysql 在联接表上使用分组依据时忽略排序依据,mysql,sql,Mysql,Sql,我正在尝试编写一个查询,以显示按最新发布日期排序的论坛线程列表 这是一个从数据库获取数据的非常简单的过程,但是由于连接和分组方式,我希望使用的排序方式是不可能的 表结构 大厅 ForumThreads 前额 期望输出 这是我理想的输出,线程按最近的线程帖子排序 | Thread Title | Last Post User | Last Post Time | Creator User | |---------------|------------------|----------
连接和分组方式
,我希望使用的排序方式是不可能的
表结构
大厅
ForumThreads
前额
期望输出
这是我理想的输出,线程按最近的线程帖子排序
| Thread Title | Last Post User | Last Post Time | Creator User |
|---------------|------------------|-----------------|----------------|
| Thread 2 | 1 | 19/02/2015 | 2 |
| Thread 1 | 2 | 18/02/2015 | 1 |
问题
目前,我可以在1个查询中获得所有内容,但是在尝试按ForumPosts.id排序时出现问题,我认为这是由于将组按与联接相结合而导致的
这意味着我有所有需要的数据,但它不是在最新的论坛帖子的顺序
当前错误查询
SELECT
ForumThreads.title,
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id ASC), ',', 1),
MAX(ForumPosts.`post_time`),
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id DESC), ',', 1)
FROM
forumThreads
INNER JOIN `ForumRooms`
ON ForumThreads.forum_room_id = ForumRooms.id
INNER JOIN `ForumPosts`
ON ForumThreads.id = ForumPosts.`forum_thread_id`
WHERE ForumRooms.id = 1
GROUP BY ForumThreads.id
ORDER BY ForumPosts.id DESC
如何编写一个查询来实现上述所需的输出
更新1
我已经尝试按照Jean François Savard的建议实现子查询方法,但是a.id的顺序被忽略,它仍然是按ForumTopics.id排序的。你可以使用子查询
select * from(
SELECT
ForumPosts.id,
group_concat(ForumThreads.title),
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id ASC), ',', 1),
MAX(ForumPosts.`post_time`),
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id DESC), ',', 1)
FROM
forumThreads
INNER JOIN `ForumRooms`
ON ForumThreads.forum_room_id = ForumRooms.id
INNER JOIN `ForumPosts`
ON ForumThreads.id = ForumPosts.`forum_thread_id`
WHERE ForumRooms.id = 1
GROUP BY ForumThreads.id) a
ORDER BY a.id DESC
您可以使用以下选项:
SELECT a.ThreadTitle, a.LastPostUser, a.LastPostTime, p2.user_id CreatorUser FROM (
SELECT t.title ThreadTitle, p.user_id LastPostUser, p.post_time LastPostTime, p.forum_thread_id
FROM (SELECT * FROM ForumPosts ORDER BY post_time DESC) p
JOIN ForumThreads t ON t.id=p.forum_thread_id
JOIN ForumRooms r ON t.forum_room_id=r.id
GROUP BY threadTitle ) a
JOIN (SELECT * FROM ForumPosts GROUP BY forum_thread_id) p2 ON p2.forum_thread_id=a.forum_thread_id
ORDER BY 3 DESC
只需对原始查询进行一个小的更改-将MAX(ForumPosts.id)添加为MAX_post_id
,然后按以下顺序排序:
SELECT
ForumThreads.title,
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id ASC), ',', 1),
MAX(ForumPosts.`post_time`),
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id DESC), ',', 1),
MAX(ForumPosts.id) AS max_post_id
FROM
forumThreads
INNER JOIN `ForumRooms`
ON ForumThreads.forum_room_id = ForumRooms.id
INNER JOIN `ForumPosts`
ON ForumThreads.id = ForumPosts.`forum_thread_id`
WHERE ForumRooms.id = 1
GROUP BY ForumThreads.id
ORDER BY max_post_id DESC
SELECT
ForumThreads.title,
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id ASC), ',', 1),
MAX(ForumPosts.`post_time`) AS max_post_time,
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id DESC), ',', 1)
FROM
forumThreads
INNER JOIN `ForumRooms`
ON ForumThreads.forum_room_id = ForumRooms.id
INNER JOIN `ForumPosts`
ON ForumThreads.id = ForumPosts.`forum_thread_id`
WHERE ForumRooms.id = 1
GROUP BY ForumThreads.id
ORDER BY max_post_time DESC
或者您可以直接使用别名MAX(ForumPosts.post_time)
并按以下顺序订购:
SELECT
ForumThreads.title,
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id ASC), ',', 1),
MAX(ForumPosts.`post_time`),
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id DESC), ',', 1),
MAX(ForumPosts.id) AS max_post_id
FROM
forumThreads
INNER JOIN `ForumRooms`
ON ForumThreads.forum_room_id = ForumRooms.id
INNER JOIN `ForumPosts`
ON ForumThreads.id = ForumPosts.`forum_thread_id`
WHERE ForumRooms.id = 1
GROUP BY ForumThreads.id
ORDER BY max_post_id DESC
SELECT
ForumThreads.title,
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id ASC), ',', 1),
MAX(ForumPosts.`post_time`) AS max_post_time,
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id DESC), ',', 1)
FROM
forumThreads
INNER JOIN `ForumRooms`
ON ForumThreads.forum_room_id = ForumRooms.id
INNER JOIN `ForumPosts`
ON ForumThreads.id = ForumPosts.`forum_thread_id`
WHERE ForumRooms.id = 1
GROUP BY ForumThreads.id
ORDER BY max_post_time DESC
你为什么需要这个小组?我在这里看不到聚合功能,按ForumPosts'post_time'DESC排序还不够吗?因为这样每个线程就有多个帖子了?我明白了,您只需要每个线程的最后一篇帖子。按MAX排序(ForumPosts.Id)DESC??即使使用a.id下的订单
出于某种原因,它仍然按ForumThreads.id DESC下订单?@Silver89确实要按ForumThreads.id分组吗?也许你想要ForumThreads.title?标题可能不是唯一的,但也会出现同样的问题?@Silver89 Try new query,我想这就是你想要的。listagg不存在
lastpostater
和CreatorUser
是相同的吗?两者都是来自ForumPosts的用户id,但一个是第一篇帖子,一个是最后一篇帖子,不是同一个用户?你可以使用“order by 3”或“order by a.LastPostTime”,它位于“选择”列表中的第三位。DESC表示后代排序。
SELECT
ForumThreads.title,
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id ASC), ',', 1),
MAX(ForumPosts.`post_time`) AS max_post_time,
SUBSTRING_INDEX(GROUP_CONCAT(ForumPosts.user_id ORDER BY ForumPosts.id DESC), ',', 1)
FROM
forumThreads
INNER JOIN `ForumRooms`
ON ForumThreads.forum_room_id = ForumRooms.id
INNER JOIN `ForumPosts`
ON ForumThreads.id = ForumPosts.`forum_thread_id`
WHERE ForumRooms.id = 1
GROUP BY ForumThreads.id
ORDER BY max_post_time DESC