【问题标题】:MySql order by date after DATE_FORMATMySql 在 DATE_FORMAT 之后按日期排序
【发布时间】:2012-10-15 22:53:06
【问题描述】:

我有两个表,fbpost 和 fbalbum,每个表都有一个名为 createdTimeDATETIME 列。我正在查找每月的专辑数量和每月的帖子数量,并将它们加在一起。

这是我的查询(如前所述):

SELECT  createdTime, itemCount FROM 
        (SELECT DATE_FORMAT(createdTime, '%m-%Y') AS createdTime, COUNT(*) AS itemCount FROM fbpost WHERE page_id =2 
        GROUP BY YEAR(createdTime), MONTH(createdTime)
        UNION ALL
        SELECT DATE_FORMAT(createdTime, '%m-%Y') AS createdTime, COUNT(*) AS itemCount FROM fbalbum WHERE page_id=2
        GROUP BY YEAR(createdTime), MONTH(createdTime)) AS foo
GROUP BY createdTime

这给出了结果:

01-2009 | 173
01-2010 | 21
01-2011 | 521
01-2012 | 776
02-2009 | 117
02-2010 | 158
02-2011 | 678
...

但我希望结果是这样排序的:

01-2009 | 173
02-2009 | 56
03-2009 | 543
04-2009 | 211
05-2009 | 723
06-2009 | 55
07-2009 | 521
...

我怎样才能做到这一点?

注意: DATE_FORMAT() 给出一个字符串,而不是 DATETIME,因此您不能按日期排序。但是,如果我在两个嵌套的 select 语句中取出 DATE_FORMAT(),我会在大多数月份得到 2 行,因为那会离开这一天。尽管每个嵌套选择每月只有一行,但它们的日期通常会有所不同,因为一个月中的最后一项可能在任何一天。

【问题讨论】:

    标签: mysql date sql-order-by union


    【解决方案1】:

    在外部查询之前不要使用DATE_FORMAT

    SELECT DATE_FORMAT(a.createdTime, '%m-%Y') AS createdTime, SUM(a.itemCount) AS itemCount
    FROM
        (SELECT DATE(createdTime) AS createdTime, COUNT(*) AS itemCount 
        FROM fbpost WHERE page_id = 2
        GROUP BY DATE(createdTime)
        UNION ALL
        SELECT DATE(createdTime) AS createdTime, COUNT(*) AS itemCount
        FROM fbalbum WHERE page_id = 2
        GROUP BY DATE(createdTime)) a
    GROUP BY YEAR(a.createdTime), MONTH(a.createdTime)
    

    See it in action *

    *Demo没有page_id

    【讨论】:

    • 不一样。第一个嵌套选择将有这样的一行:2009-1-29 | 152,而第二个将有:2009-1-30 | 21,因为 1-29 之后没有帖子,1-30 之后没有专辑。 UNION 将导致一月份的两行,而不是 1
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多