2

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

所以换句话说

user:
id | phone

item:
id | user_id | timestamp

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

有没有更好的方法来实现这一点......我最初只是在思考,distinct但这似乎并没有奏效。

TIA

[编辑] 针对乔斯林的以下问题: select user.id, item.timestamp from item join user on user.id = item.user_id order by user.id

4

3 回答 3

1

使用ORDER BYwithDESC子句:

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
于 2012-08-22T23:35:39.143 回答
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 标准,但非常方便。

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

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

于 2012-08-23T00:11:05.347 回答
0

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

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

抱歉,但如果没有表模式,就很难比这更具体。希望JOIN参考资料指出您修改查询的正确方向。

于 2012-08-22T23:57:59.327 回答