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