2012-08-05 94 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"