我有一个连接几个表并产生大量行的查询,在这种情况下我只希望每个用户看到一行。我通过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
答案 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
引用指向正确的方向来修改您的查询。