【问题标题】:MySQL JOIN to pull up latest posts by comparing post dates and comments datesMySQL JOIN 通过比较发布日期和评论日期来提取最新帖子
【发布时间】:2012-06-30 13:32:02
【问题描述】:

嗯,我有两张表 community 和 community_cmets。 community 是存储主题标题和主题的其他详细信息的表。 community_details 是存储主题/线程的所有帖子或 cmets 的表。

我需要根据线程的 cmets 日期以及原始主题/线程的日期提取最新的五个主题。

现在可能有一些线程还没有任何 cmets,但比一些确实有 cmets 的线程更新。我需要正确地把它们拉起来。

我尝试了诸如

之类的查询
SELECT MAX(community_comments.id), `community`.*
FROM (`community`)
LEFT JOIN `community_comments` ON `community`.`id`=`community_comments`.`community_id`
WHERE `community`.`type` = 1
GROUP BY `community_comments`.`id`
ORDER BY `community_comments`.`date_posted` DESC
LIMIT 5 

这多次拉起同一个线程,而这

SELECT MAX(community_comments.id), `community`.*
FROM (`community`)
LEFT JOIN `community_comments` ON `community`.`id`=`community_comments`.`community_id`
WHERE `community`.`type` = 1
GROUP BY `community_comments`.`community_id`
ORDER BY `community_comments`.`date_posted` DESC
LIMIT 5 

提取独特的线程,但不提取正确的最新线程。

社区的表结构是:

CREATE TABLE `community` (   
  `id` varchar(12) character set utf8 NOT NULL,   
  `title` varchar(255) character set utf8 NOT NULL,   
  `content` text character set utf8 NOT NULL,   
  `author` varchar(13) character set utf8 NOT NULL,   
  `category` int(10) unsigned NOT NULL,   
  `type` tinyint(1) unsigned NOT NULL default '1' COMMENT '1 = Forum; 2 = Site Help; 3 = Local & Global',   
  `location` varchar(100) character set utf8 NOT NULL,   
  `country` int(10) unsigned NOT NULL,   
  `date_posted` datetime NOT NULL,   
  PRIMARY KEY  (`id`)   
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;   

community_cmets 的表结构是:

CREATE TABLE `community_comments` (   
  `id` varchar(12) character set utf8 NOT NULL,   
  `community_id` varchar(12) character set utf8 NOT NULL,   
  `content` text character set utf8 NOT NULL,   
  `member_id` varchar(13) character set utf8 NOT NULL,   
  `type` tinyint(1) unsigned NOT NULL default '1' COMMENT '1 = Forum; 2 = Site Help; 3 =  Local & Global',   
  `quoted` varchar(12) character set utf8 NOT NULL COMMENT 'Id number of the comment that is being quoted',   
  `date_posted` datetime NOT NULL,   
  PRIMARY KEY  (`id`)   
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;   

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 在您的第一个查询中,您不想按社区 ID 而非社区评论 ID 进行分组吗?
  • @MrSlayer 是的,我也试过了,但结果不准确

标签: mysql group-by


【解决方案1】:

因此,如果我的理解正确,您需要包含 5 个最新 community_cmets 的社区字段。您想使用 SQL Group By 来解决这个问题。

SELECT c.*, MAX(com.date_posted) as last_post
FROM community c
LEFT OUTER JOIN community_comments com
ON com.community_id = c.id
GROUP BY c.id
ORDER BY MAX(com.date_posted) DESC
LIMIT 5

如果您不想显示没有 cmets 的社区,可以将左外连接替换为内连接。

【讨论】:

  • McKevin,谢谢你的回答,我试过了。如果所有线程在 community_cmets 表中都有帖子,它会完美运行。当有一些没有帖子的线程时,它确实会正确地提取记录,但是排序出错了。现在调查一下。
  • 你如何区分主题和帖子?它们都保存在您的 community_cmets 表中吗?还是社区是线程?我已经根据您的表结构在本地尝试了查询,如果社区没有相关的 community_comment,它将在列表中排在最后。你希望它表现如何?
  • 对于没有 cmets 的线程,last_post 为 NULL,添加一个 IFNULL 子句就可以了 :)
  • 社区表保存线程。创建新线程时,会将详细信息插入社区表中。 community_cmets 表中没有新线程的记录。当有人在线程中发帖时,它会存储在 community_cmets 表中。因此,对于每个线程,线程详细信息存储在 community 表中,线程的帖子存储在 community_cmets 表中。
  • 酷,那么是的,您使用 IFNULL 或 COALESCE 的解决方案将是回到社区表发布日期的最佳方式。
【解决方案2】:
SELECT c.*, IFNULL(MAX(com.date_posted),c.date_posted) as last_post 
            FROM community c 
            LEFT OUTER JOIN community_comments com 
            ON com.community_id = c.id 
            GROUP BY c.id 
            ORDER BY last_post DESC 
            LIMIT 5 ;

【讨论】:

    猜你喜欢
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多