2012-08-05 91 views
1

我最近接管了另一個開發人員的一些工作,並試圖理解爲什麼特定的sql查詢不適用於某些時間戳,更具體地說是同一日期的時間戳,sql查詢是:在表達式上使用GROUP BY的SQL查詢不檢索所有條目

select FROM_UNIXTIME(order_time,'%Y.%m.%D') as order_time, 
     order_time as timealias 
    from orders 
    where order.id ='.$user->id.' 
    group by FROM_UNIXTIME(order_time,'%Y.%m.%D') 
    order by timealias desc 

這個想法是,如果日期在不同的日子,訂單按用戶查看的日期分組。

這工作得很好:

03/08/2012, 15:10:30 (Unix Timestamp: 1344006630) 
04/08/2012, 12:10:30 (Unix Timestamp: 1344082230) 

但是,如果他們是在同一天,但在不同的時間,然後顯示在表中,但第二個一階。

03/08/2012, 15:10:30 (Unix Timestamp: 1344006630) 
03/08/2012, 17:30:25 (Unix Timestamp: 1344015025) 

我的理論是,它不承認第二入口的日期作爲比賽進行到第一入口的,但自該日起已被使用它打破,或諸如此類的話。但考慮到數據庫不是我的強項,這是一個猜測。

如果有人知道爲什麼它的行爲是正確的,我會非常感謝一些見解。

+0

一般規則:不使用GROUP BY除非你在查詢中有一些聚合(COUNT,SUM,MIN,MAX等)。另外,MySQL儘管如此,一般而言,您應該列出GROUP BY子句中SELECT列表中的所有非聚合列;大多數SQL DBMS都需要它,它提供了確定性,它忽略了GROUP BY子句中的列。有特殊的情況下,它是好的(不要列出GROUP BY子句中的列);它們比它重要的情況更罕見。 – 2012-08-05 23:22:19

回答

1

您的查詢在FROM_UNIXTIME包含GROUP BY。這將爲每個FROM_UNIXTIME選擇一個「隨機」行,這不是您想要的。

如果你想看到每一個時間戳,包括重複:

"select FROM_UNIXTIME(order_time,'%Y.%m.%D') as order_time, order_time as timealias from orders where order.id ='".$user->id."' order by timealias desc" 

如果你想顯示的順序爲每個FROM_UNIXTIME數量:

"select FROM_UNIXTIME(order_time,'%Y.%m.%D') as order_time, order_time as timealias, COUNT(*) order_cnt from orders where order.id ='".$user->id."' group by 1 order by timealias desc"