除了提升之外,是否可以按任何顺序进行分组?

时间:2012-08-22 23:26:39

标签: mysql

我有一个连接几个表并产生大量行的查询,在这种情况下我只希望每个用户看到一行。我通过user.id使用group解决了“只有一个用户”的问题,但是,我注意到现在每个用户都从连接表中获取代表第一个条目(而不是最后一个条目)的值。 / p>

所以换句话说

user:
id | phone

item:
id | user_id | timestamp

我的意图是加入这些表并选择最新项目(基于时间戳或item.id desc),但每个用户只能获得一个项目(而不是查看每个用户拥有的所有项目)。 group by user.id解决了每个用户只给我一个项目的问题,但是他们总是出现第一个具有最低item.id的项目,而我想要最新的项目。

有没有更好的方法来实现这一点......我最初用distinct进行了涂鸦,但这似乎并没有成功。

TIA

[编辑] 回应Jocelin的问题如下: select user.id, item.timestamp from item join user on user.id = item.user_id order by user.id

3 个答案:

答案 0 :(得分:1)

使用带有ORDER BY子句的DESC

select 
  user.id, item.timestamp 
from 
  item 
join 
  user on user.id = item.user_id 
group by
  user.id
order by 
  user.id DESC

<击>

我怀疑(根据您在下面的评论中)您的问题并不是您所描述的。尝试这样的事情(未经测试,因为我不使用MySQL - 它适用于SQL Server和SQLite):

select
  user.id, i.ts
from 
  (select id, max(timestamp) as ts from items group by id) i
join
  user u on u.id = i.id

答案 1 :(得分:1)

mysql有一个“作弊”,用于获取每组的第一行:

select *
from (select
        u.id as user_id,
        u.name,
        i.id as item_id,
        i.timestamp
      from user u
      join item i on i.user_id = u.id
      order by timestamp desc -- "desc" = order descending
    ) x
group by user_id

“作弊”是mysql允许你按列聚合非组(与我知道的每个其他数据库不同)。它不返回SQL语法错误,而是仅返回每个组的第一个记录。不是SQL标准,但非常方便。

这样做的好处是你不需要任何相关的子查询,这些子查询非常慢。

内部查询用于按时间戳最新优先顺序对记录进行排序,因此每个用户遇到的第一条记录是“最新的”。

答案 2 :(得分:0)

您需要使用JOIN。首先按用户创建子选择分组并选择时间戳的MAX。这会为每个用户提供一行,包含最新的条目(并丢失所有其他字段)。

然后使用JOIN表达式中的时间戳将其连接回来,以恢复丢失的字段。

很抱歉,但如果没有表格架构,就不容易比这更具体。希望JOIN引用指向正确的方向来修改您的查询。