【问题标题】:MySQL Select Newest Approval Date among article date & comment dateMySQL 在文章日期和评论日期中选择最新批准日期
【发布时间】:2013-04-22 11:08:28
【问题描述】:

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

  1. 如果文章没有已批准的评论,则 lastmod 是批准 文章的日期。
  2. 如果文章至少有 1 条已获批准的评论,则 lastmod 是 相关文章最后批准评论的批准日期。

php unsuccessful while loop within prepared statements问题并阅读答案后,我决定

  1. 不要为这种情况使用循环
  2. col_article_id 列添加到我的 cmets 表中,该表显示 文章表中相关文章的id
  3. 并尝试使用更智能的 mySQL 查询来解决我的问题

我有 2 张桌子:

  1. 文章
  2. cmets (comments.col_article_id 将评论链接到相关的 文章)

在我尝试下面的查询后,

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 - 我需要某种方式,好像 mysql 语法允许 select max( tb_articles.col_approvaldate, tb_comments.col_approvaldate)

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

所以我知道我走错了路。

我还搜索了“mysql latest row per group”关键字。但这毕竟是我可以到达的地方。

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

【问题讨论】:

    标签: mysql select inner-join


    【解决方案1】:

    我是否正确理解文章的tb_comments 记录是默认创建的?这不应该是这样 - 如果没有 cmets,那么那里不应该有记录。如果有,您输入的默认日期是什么?空值?此外,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
    

    【讨论】:

    • 首先,我尝试了phpadmin sql窗口中的查询。不幸的是,它给了我“#1054 - 'where 子句'中的未知列'tb_articles.col_status'”消息。我肯定在相关表中有这一列。其次,我的逻辑是:作者保存到 tb_articles。当时状态='待定'。然后如果编辑批准,状态变为“已批准”。这意味着文章已发表。然后人们写cmets。同样的逻辑在这里也适用。第一次保存意味着自动挂起。然后,如果编辑批准评论状态也变为“已批准”并发布。如果状态为待处理,则批准日期为空。
    • 已编辑查询 - 立即查看。
    • 感谢您的帮助,最好的问候。
    【解决方案2】:

    试试这个:

    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;
    

    【讨论】:

    • 我在 phpadmin sql 窗口中尝试了查询。不幸的是,它只给了我 1 条记录。栏目标题last_approved,只有1条记录是我站内最新评论的批准日期。
    • 查看编辑后的答案。您可以从 tb_articles 添加更多列 - 如果您这样做,也将它们添加到组中(按我的数字或名称)
    • 编辑后的答案结果是:如果批准的文章有/已经批准的评论,则日期可以正常工作;但是,没有任何评论的批准文章的日期带有 NULL 值。感谢您的帮助,最好的问候。
    • 必须是 greatest() 认为 null 大于值。我已经编辑了答案 - 看看它是否适合你(它应该!)。
    • 我留下了一个括号 - 现在试试 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2011-09-30
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多