然后在Mysql中使用Join来命令Group By

时间:2017-03-04 07:04:46

标签: mysql sql

我有两个表一个包含用户信息,而另一个包含用户的设备令牌和设备类型等。

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)表中添加条件。

2 个答案:

答案 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