MySQL选择文章日期和版本之间的最新批准日期。评论日期

时间:2013-04-28 20:35:57

标签: mysql select inner-join

我的目的是为我的lastmod文件写下我批准文章的最后修改日期(sitemap.xml)。这些数据有两种可能性。

  1. 如果文章没有批准的评论,则lastmod是批准 文章的日期。
  2. 如果文章至少有1个已批准的评论,那么lastmod就是 最后批准的相关文章评论的批准日期。
  3. 在询问php unsuccessful while loop within prepared statements问题并阅读答案后,我决定

    1. 不使用为此案例准备的循环
    2. col_article_id列添加到我的评论表中,该表显示了 相关文章在文章表中的ID
    3. 并尝试使用更智能的mySQL查询来解决我的问题
    4. 我有两张桌子:

      1. 制品
      2. 评论(comments.col_article_id将评论与相关评论相关联 文章)
      3. 在我尝试下面的查询后,

        select tb_articles.col_approvaldate, tb_comments.col_approvaldate
        from tb_articles, tb_comments
        where tb_articles.col_status ='approved' AND tb_comments.col_status ='approved' AND tb_articles.col_id=tb_comments.col_article_id
        

        我的问题是:

        1 - 我需要一些,就好像在select max( tb_articles.col_approvaldate, tb_comments.col_approvaldate)

        的mysql语法中允许的那样

        2 - 如果我有n个批准的文章没有任何批准的评论和批准的评论批准的文章,那么我应该有n + m个结果行,每行有1列。但是目前,我有m行,每行有2列。

        所以我知道我的方式非常糟糕。

        我还搜索了“ mysql每组最新行”关键字。但这就是我毕竟能够到达的那一点。

        这是我的第一次join体验。你能纠正我吗?最好的问候

2 个答案:

答案 0 :(得分:1)

试试这个:

select
    tb_articles.id,
    ifnull(
        max( tb_comments.col_approvaldate),
        tb_articles.col_approvaldate
    ) as last_approved
from tb_articles
left join tb_comments
    on tb_articles.col_id=tb_comments.col_article_id
    and tb_comments.col_status ='approved'
where tb_articles.col_status ='approved'
group by 1;

答案 1 :(得分:0)

我是否正确理解默认情况下会创建文章的tb_comments条记录?情况应该不是这样 - 如果没有评论,那里就不应该有记录。如果有,您输入的默认日期是什么?空值?另外tb_comments.col_status对我来说似乎是多余的 - 如果你有tb_comments.col_approvaldate那么它在那个日期就被批准了,而你根本不需要地位。

此查询可能适用于您(如果我理解您的表结构,则评论AND不应更改内容):

SELECT 
    a.col_id AS 'article_id',
    IFNULL(MAX(c.col_approvaldate), a.col_approvaldate)
FROM 
    tb_articles a 
    LEFT JOIN tb_comments c ON a.col_id = c.col_article_id #AND c.col_status ='approved'
WHERE 
    a.col_status ='approved'
GROUP BY a.col_id