使用唯一数据从多个表中对MySQL SELECT数据进行排序

时间:2015-01-22 21:43:48

标签: php mysql

在我正在做的一个小组项目(论坛)中,我一直坚持通过上一个回复对论坛话题进行排序的任务。我知道标题有些令人困惑,但我们会尝试了解下面的情景。

我有两个表,它们有一些外键和关系键,我想从包含最新帖子的线程的表中选择的行和该线程的相关ID。

两个数据库表如下所示:

- ForumThread -

  • ID [int] ,显示线程实体的唯一标识符
  • 标题[string],用户定义的主题标题
  • 作者[int],制作此帖子的用户的ID(我知道这是多余的:P)
  • Views [int],线程上的观看量
  • Date [int],unix epoch number,定义创建线程的时间

- ForumPost -

  • ID [int],线程回复的唯一标识符(与线程ID不同)
  • ThreadID [int] ,引用此帖子/回复的帖子的ID与
  • 相关联
  • Poster [int],做出此回复的用户的用户ID
  • 内容[string],回复内容
  • CreationDate [int] ,这是一个用于创建回复的非同名的密钥

正如您在上面所看到的,一些应该能够与另一个表中的键相关的表键具有不同的名称。此外,我需要链接/分组/加入ForumPost.ThreadID到ForumThread.ID,但我目前的所有努力只让我为每个线程的回复获得多行,这意味着一个线程,例如,在对结果进行排序后,2个回复将显示两次。

这是我到目前为止所尝试的内容:

尝试按上一篇文章排序线程:

    SELECT DISTINCT ForumPost.ThreadID, 
                    ForumThread.* 
      FROM ForumThread 
 LEFT JOIN ForumPost 
        ON ForumThread.ID = ForumPost.ThreadID 
  GROUP BY ForumPost.ThreadID 
  ORDER BY ForumPost.CreationDate DESC, 
           ForumThread.ID DESC 
     LIMIT $offset, 10

    SELECT ForumThread.* 
      FROM ForumThread 
 LEFT JOIN ForumPost 
        ON ForumThread.ID = ForumPost.ThreadID 
  GROUP BY ForumPost.ThreadID, 
           ForumThread.ID 
  ORDER BY ForumPost.CreationDate DESC, 
           ForumThread.ID DESC 
     LIMIT $offset, 10

    SELECT DISTINCT ForumThread.* 
      FROM ForumThread 
INNER JOIN ForumPost 
        ON ForumThread.ID = ForumPost.ThreadID 
  GROUP BY ForumThread.ID 
  ORDER BY ForumPost.CreationDate DESC, 
           ForumThread.ID DESC 
     LIMIT $offset, 10

原始简单查询:

    SELECT * 
      FROM ForumThread 
  ORDER BY ID DESC 
     LIMIT $offset, 10

在这种情况下,您是否只是建议单独获取信息,并使用PHP之类的语言(显然这是我们在此项目中使用的)来关联两个不同的MySQL结果并对它们进行排序,或者你有更快更紧凑的解决方案吗?

请注意;对于那些推荐我使用MySQLi的人,我可以确认我的小组已经考虑过是否使用MySQLi或MySQL,尽管我们的学习评论仅涵盖了过时的MySQL材料,这使得我们重视学习MySQLi的可能性。这个项目的最后期限很短。

1 个答案:

答案 0 :(得分:0)

这是使用相关子查询的可能性;希望它有所帮助

SELECT 
   ForumThread.id, Title, 
      (SELECT MAX(CreationDate) FROM ForumPost 
       WHERE 
           ForumPost.ThreadID = ForumThread.id) AS lastentry
 FROM ForumThread group by 1, 2 order by 3 desc;