2014-03-27 159 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(日期(開始)) –