首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL按日期排序

问MYSQL按日期排序
EN

Stack Overflow用户
提问于 2014-03-27 16:21:48
回答 2查看 421关注 0票数 0

我需要从一个表中选择一个具有“最高”日期和时间的行,但是我无法得到最高的一个,DESC的命令不起作用。以下是我的查询:

代码语言:javascript
复制
SELECT count(*) as c, 
       start, 
       UNIX_TIMESTAMP(start) as S, 
       duration
  FROM appuntamento
 WHERE DATE(start) = DATE('2014-04-08 18:30:00') 
 ORDER BY S DESC 
 LIMIT 1

我不关心在unix时间戳中获得起始值,而是第n次尝试通过这个

有小费吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-27 16:41:05

这里有几个问题。首先,COUNT(*)的存在将它转化为聚合查询,这是您不想要的。这可能是你麻烦的原因。

其次,如果您的appuntamento表中有很多行,则此查询的性能将很差,因为您不能使用索引。

假设您想要表中某一天的最后一行(最新的时间)的时间和持续时间,以及同一天的约会次数,则需要这样做:

代码语言:javascript
复制
 SELECT a.start, a.duration, b.count
   FROM (
         SELECT start,
                duration
           FROM appuntamento
          WHERE start >= DATE('2014-04-08 18:30:00')
            AND start < DATE('2014-04-08 18:30:00') + INTERVAL 1 DAY
          ORDER BY start DESC, duration DESC
          LIMIT 1
        ) AS a
    JOIN (
         SELECT COUNT(*) AS count
           FROM appuntamento
          WHERE start >= DATE('2014-04-08 18:30:00')
            AND start < DATE('2014-04-08 18:30:00') + INTERVAL 1 DAY
         ) AS b

说明:首先,这种形式的start搜索允许您在start列上使用索引。你想这么做是出于表现上的原因。

代码语言:javascript
复制
          WHERE start >= DATE('2014-04-08 18:30:00')
            AND start < DATE('2014-04-08 18:30:00') + INTERVAL 1 DAY

其次,您需要将COUNT(*)作为一个单独的子查询处理。我已经做过了。

第三,您肯定可以执行ORDER BY start DESC,如果start是DATETIME列,它就能工作。不需要UNIX_TIMESTAMP()。

第四,如果碰巧有几个时间相同的ORDER BY start DESC, duration DESC,我就使用start来安排返回最长的约会。

票数 0
EN

Stack Overflow用户

发布于 2014-03-27 16:31:44

如果您只需要返回一行,那么就使用MAX()函数,而不使用订单。应该能起作用。

代码语言:javascript
复制
SELECT count(*) as c, 
       MAX(start) as highest_date, 
       UNIX_TIMESTAMP(start) as S, 
       duration
  FROM appuntamento
 WHERE DATE(start) = DATE('2014-04-08 18:30:00') 

还有你的陈述定单。您需要添加一个组,这样就不会将不正确的行与COUNT()聚合组合起来。

代码语言:javascript
复制
 SELECT count(*) as c, 
       start, 
       UNIX_TIMESTAMP(start) as S, 
       duration
 FROM appuntamento
 WHERE DATE(start) = DATE('2014-04-08 18:30:00') 
 GROUP BY S
 ORDER BY S DESC 
 LIMIT 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22693458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档