在表达式上使用GROUP BY的SQL查询不会检索所有条目

时间:2012-08-05 20:26:35

标签: sql timestamp

我最近从另一个开发人员手中接过了一些工作,并试图理解为什么特定的sql查询不适用于某些时间戳,更具体地说是同一日期的时间戳,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)

我的理论是,它不会将第二个条目的日期识别为与第一个条目的匹配,但是由于该日期已经使用它已经中断,或者是那种效果。但考虑到数据库不是我的强项,这是一个猜测。

如果有人知道它的行为是正确的原因,我会非常感激一些见解。

1 个答案:

答案 0 :(得分: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"