关于取每个用户最新一条留言去重的问题

忍不住还是开口了。

表一 messages

id (PRIMARY KEY)、to_user_id、from_user_id、content、created_at

表二 user

id (PRIMARY KEY)、name、created_at

查询当天最新的messages并分页,要求同user只取一条messages;

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10

不是用 group 就好了吗?

4年前 评论
waney (楼主) 4年前
全场我最姜姜姜丶 4年前
_Daniel (作者) 4年前

使用 DISTINCT 用户ID

4年前 评论
waney (楼主) 4年前

使用 keyBy(' 用户ID ')

4年前 评论
waney (楼主) 4年前

试试跟据from_user_id分组获得本组最大自增id,然后再in出来呢。数据量大可能会是个坑,但如果每日几万条数据应该是没问题的,配合created_at索引使用。

SELECT * FROM message WHERE id IN (SELECT MAX(id) message test GROUP BY from_user_id);
4年前 评论
waney (楼主) 4年前
yichengo (作者) 4年前
waney (楼主) 4年前
yichengo (作者) 4年前
waney (楼主) 4年前
yichengo (作者) 4年前
yichengo (作者) 4年前
waney (楼主) 4年前

增加一个字段 is_user_latest, 代表是否这个用户最新一条评论
就 OK 了

4年前 评论
waney (楼主) 4年前
JerryBool (作者) 4年前
waney (楼主) 4年前
yichengo 4年前
全场我最姜姜姜丶 4年前

SELECT max(created_at),from_user_id,content from messages WHERE created_at like "%2019-08-21%" GROUP BY from_user_id ORDER BY from_user_id desc limit 100;


不知道这个能适应你的需求不;

4年前 评论
wuyan94zl 4年前
littlehero (作者) 4年前
yichengo 4年前
littlehero (作者) 4年前
waney (楼主) 4年前
yichengo 4年前
小猪蹄子 4年前

SELECT
    `t`.*
FROM
    (
        SELECT
            `m`.`id`,
            `m`.`to_user_id`,
            `m`.`from_user_id`,
            `u`.`name`,
            `m`.`content`,
            `m`.`created_at`
        FROM
            `messages` AS m,
            `user` AS u
        WHERE
            `m`.`to_user_id` = `u`.`id`
        ORDER BY
            `m`.`created_at` DESC
    ) AS t
GROUP BY
    `t`.`to_user_id`
LIMIT 0,20
4年前 评论

关于group by组内排序的问题,mysql官方文档有讲
https://dev.mysql.com/doc/refman/5.6/en/gr...
MySQL extends the standard SQL use of GROUP BY so that the select list can refer to nonaggregated columns not named in the GROUP BY clause. This means that the preceding query is legal in MySQL. You can use this feature to get better performance by avoiding unnecessary column sorting and grouping. However, this is useful primarily when all values in each nonaggregated column not named in the GROUP BY are the same for each group. The server is free to choose any value from each group, so unless they are the same, the values chosen are nondeterministic. Furthermore, the selection of values from each group cannot be influenced by adding an ORDER BY clause. Result set sorting occurs after values have been chosen, and ORDER BY does not affect which values within each group the server chooses.
结论就是除非记录完全相同,否则mysql 不保证每次group by结果相同

4年前 评论

我这样做,效果已达到。

DB::table('messages as t1')
  ->leftJoin('messages as t2', function ($join) {
    $join->on('t1.from_user_id', '=', 't2.from_user_id')->on('t1.id', '<', 't2.id');
})
  ->leftJoin('user as t3', 't1.from_user_id', '=', 't3.id')
  ->where('t1.to_user_id', $id)
  ->whereNull('t2.id')->paginate(15);
4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!