我有两个表一个包含用户信息,而另一个包含用户的设备令牌和设备类型等。
tbl_user
+----+----------+-----------+
| id | username | is_active |
+----+----------+-----------+
| 15 | UserA | 1 |
| 62 | UserB | 1 |
+----+----------+------------
tbl_user_token
+----------+---------+--------------+
| table_id | user_id | device_token |
+----------+---------+--------------+
| 1 | 15 | XXXXXXXXX |
| 2 | 15 | XXXXXXXXX |
| 3 | 15 | XXXXXXXXX |
| 4 | 62 | XXXXXXXXX |
| 5 | 62 | XXXXXXXXX |
| 6 | 62 | XXXXXXXXX |
+----------+---------+--------------+
所以现在我想从tbl_user_token获取最新记录 在上面的情况下,它应该是
+---+----+-----------+
| 3 | 15 | XXXXXXXXX |
| 6 | 62 | XXXXXXXXX |
+---+----+-----------+
到目前为止,我已经完成了以下工作:
SELECT * FROM tbl_user tu
join tbl_user_token tut
on tut.user_id = tu.id
where tu.id in (15,62) and tu.is_active=1
group by tut.user_id
但它没有获取最新记录。
注意:我的问题与建议的问题不同,因为该问题的答案集中在如何从单个表中获取最大值记录。但是,如果需要使用与另一个表的连接并找到最新记录,则没有关于该怎么做的信息。
我必须在其他表(即使用tbl_user)表中添加条件。
答案 0 :(得分:1)
根据您的预期输出,您不需要加入tbl_user表。
您可以从每个user_id中找到最新的table_id,然后将其与原始表连接以获得所需的结果。
试试这个:
select t1.*
from tbl_user_token t1
join (
select user_id, max(table_id) table_id
from tbl_user_token
where user_id in (15, 62)
group by user_id
) t2 on t1.user_id = t2.user_id
and t1.table_id = t2.table_id
另一种方法是使用左连接:
select t1.*
from tbl_user_token t1
left join tbl_user_token t2 on t1.user_id = t2.user_id
and t1.table_id < t2.table_id
where t2.user_id is null
and t1.user_id in (15, 62)
如果你想加入tbl_user,试试这个:
select t1.*, tu.*
from tbl_user_token t1
join (
select user_id,
max(table_id) table_id
from tbl_user_token
where user_id in (15, 62)
group by user_id
) t2 on t1.user_id = t2.user_id
and t1.table_id = t2.table_id
join tbl_user tu on t1.user_id = tu.id
对于左连接替代方案,请尝试以下方法:
select t1.*, tu.*
from tbl_user_token t1
left join tbl_user_token t2 on t1.user_id = t2.user_id
and t1.table_id < t2.table_id
join tbl_user tu on t1.user_id = tu.id
where t2.user_id is null
and t1.user_id in (15, 62)
答案 1 :(得分:1)
您可以按user_id
并按table_id
的降序给出行号组。然后选择行号为1的行。
<强>查询强>
select t1.`table_id`, t1.`user_id`, t1.`device_token` from
(
select `table_id`, `user_id`, `device_token`,
(
case `user_id` when @A
then @R := @R + 1
else @R := 1 and @A := `user_id` end
) as `rn`
from `tbl_user_token` t,
(select @R := 0, @A := '') r
order by `user_id`, `table_id` desc
)t1
where t1.`rn` = 1
order by t1.`table_id`;
Sql Fiddle demo here