2014-03-27 81 views
0

我需要从表格中选择一个具有“最高”日期和时间的行,但我无法获得最高的一个,ORDER BY DESC不起作用。 这里是我的查询:MYSQL order by datetime

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试图通过这个

任何提示,以帮助?

+0

您可以使用http://sqlfiddle.com/ –

+1

提供样本数据集和您的表格定义为什么不只是在您的选择中做MAX(开始)? –

+0

不要忘记接受一个答案,如果它解决了你的问题! :) –

回答

0

这里有一些问题。首先,COUNT(*)的存在会将此变为一个聚合查询,您不需要。这可能是你麻烦的原因。其次,如果您的appuntamento表中有很多行,则此查询的性能会很差,因为您无法使用索引。所需的时间和从某一天在你的表中的最后(最新即时)行持续时间以及预约当天的号

假设,你需要这样做:

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列中的索引。出于性能原因,您需要这样做。

  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

如果你想要的只有一行返回,那么使用不带顺序的MAX()函数。应该做的伎俩。

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') 

也与您的ORDER BY语句。您需要添加一个组,以便您不将不正确的行与COUNT()聚合组合在一起。

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

,如果你想删除时间戳,只是得到“最高”的日期,然后做MAX(日期(开始)) –