【问题标题】:MySQL group by, but show all and order by dateMySQL group by,但显示全部并按日期排序
【发布时间】:2013-09-11 05:46:01
【问题描述】:

我有下面的mysql表

ID (int)        parent_id (int)        title (str)     date (int - unix timestamp)
------------------------------------------------------------------------------------
252                 2                  Title 1         1378872876  (01. sept)
262                 2                  Title 2         1378870827  (02. sept)
273                 3                  Title 3         1378870800  (04. sept)
296                 3                  Title 4         1378869614  (05. sept)
301                 2                  Title 5         1378869384  (02. sept)
324                 4                  Title 6         1378868522  (02. sept)
339                 3                  Title 7         1378865096  (03. sept)
355                 3                  Title 8         1378864830  (02. sept)
365                 4                  Title 9         1378863323  (04. sept)
366                 4                  Title 10        1378863240  (02. sept)
376                 2                  Title 11        1378859731  (01. sept)
381                 5                  Title 12        1378858380  (03. sept)
388                 3                  Title 13        1378858080  (02. sept)
392                 4                  Title 14        1378857600  (04. sept)

我想要做的是选择按 unix 时间戳排序的所有行(仅一天),但也按 parent_id 分组。因此,SQL 查询应返回以下内容:

ID (int)        parent_id (int)        title (str)     date (int - unix timestamp)
------------------------------------------------------------------------------------
296                 3                  Title 4         1378869614  (05. sept)
273                 3                  Title 3         1378870800  (04. sept)
339                 3                  Title 7         1378865096  (03. sept)
388                 3                  Title 13        1378858080  (02. sept)
355                 3                  Title 8         1378864830  (02. sept)
392                 4                  Title 14        1378857600  (04. sept)
365                 4                  Title 9         1378863323  (04. sept)
366                 4                  Title 10        1378863240  (02. sept)
324                 4                  Title 6         1378868522  (02. sept)
381                 5                  Title 12        1378858380  (03. sept)
262                 2                  Title 2         1378870827  (02. sept)
301                 2                  Title 5         1378869384  (02. sept)
252                 2                  Title 1         1378872876  (01. sept)
376                 2                  Title 11        1378859731  (01. sept)

我尝试了以下方法,但这并不是我真正想要的:

 SELECT 
         f.*, 
         FROM_UNIXTIME(f.post_date , '%d' ) AS day, 
         FROM_UNIXTIME(f.post_date , '%H' ) AS hour 
    FROM feeds f 
    WHERE f.parent_id IN (200,194,176,182,190,181,189,196,191) 
    GROUP BY f.parent_id 
    ORDER BY f.post_date DESC  
    LIMIT 0,100

这只能用 mysql 完成还是我必须构建多个查询?

【问题讨论】:

  • 按 f.parent_Id,f.post_date 排序?
  • 他想按日期(desc)在每个组内排序,并按其最大日期(最大组 3 = 5 sep,最大组 4 = 4 sep 等等)对每个组进行排序

标签: php mysql sql group-by


【解决方案1】:
SELECT f.*
FROM feeds f
INNER JOIN (SELECT parent_id, MAX(post_date) AS Ordered GROUP BY parent_id) o
ON f.parent_id = o.parent_id
ORDER BY o.Ordered

【讨论】:

    【解决方案2】:

    通过 parent_id 查找最新帖子,使用其时间戳作为第一列排序,parent_id 作为第二列(如果两个时间戳相同),最后使用实际时间戳。

    SELECT 
         f.*, 
         FROM_UNIXTIME(f.post_date , '%d' ) AS day, 
         FROM_UNIXTIME(f.post_date , '%H' ) AS hour 
    FROM feeds f
    JOIN ( SELECT parent_id, MAX( post_date ) as latest_post
              FROM feeds
              GROUP BY parent_id ) fl
    ON f.parent_id = fl.parent_id
    ORDER BY fl.latest_post DESC, parent_id, f.post_date DESC
    

    【讨论】:

      【解决方案3】:

      你需要告诉mysql它应该如何聚合非分组的列。当您订购时,您可以通过别名日或功能来完成。即:

      ORDER BY FROM_UNIXTIME(f.post_date , '%d' )
      

      ORDER BY DAY
      

      别名 DAY 可能是保留关键字,所以我会考虑更改它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 2018-07-16
        • 1970-01-01
        • 2012-08-31
        • 2012-01-15
        • 1970-01-01
        相关资源
        最近更新 更多