如何获取25条无重复user_id的随机有效查询结果?
解决方案:确保获取25个独立用户的SQL查询
问题根源
你的原SQL中SELECT distinct user_id, rcv_from, apptid是对三个字段的组合去重,而非仅保证user_id唯一。如果同一个用户存在多条不同rcv_from或apptid的记录,这些行都会被保留。执行ORDER BY RAND() Limit 25时,可能会选中同一个用户的多条记录,导致最终结果里的独立用户数不足25。
正确写法(以MySQL为例)
先随机筛选出25个符合条件的独立user_id,再关联原表获取每个用户的对应记录(以下两种方式任选其一):
方式1:获取每个用户的最新记录
SELECT t.user_id, t.rcv_from, t.apptid FROM ( -- 先随机选出25个唯一用户ID SELECT DISTINCT user_id FROM view.data_all WHERE facility LIKE '%dallas%' AND rcv_from >= '2020-10-01' AND rcv_from <= '2021-09-30' ORDER BY RAND() LIMIT 25 ) AS random_users -- 关联原表获取该用户的记录 JOIN view.data_all AS t ON t.user_id = random_users.user_id -- 筛选出该用户在时间范围内的最新记录 WHERE t.rcv_from = ( SELECT MAX(rcv_from) FROM view.data_all WHERE user_id = random_users.user_id AND facility LIKE '%dallas%' AND rcv_from >= '2020-10-01' AND rcv_from <= '2021-09-30' )
方式2:获取每个用户的任意一条记录(简化版)
如果不需要指定取哪条记录,可通过GROUP BY直接聚合:
SELECT t.user_id, MAX(t.rcv_from) AS rcv_from, MAX(t.apptid) AS apptid FROM ( SELECT DISTINCT user_id FROM view.data_all WHERE facility LIKE '%dallas%' AND rcv_from >= '2020-10-01' AND rcv_from <= '2021-09-30' ORDER BY RAND() LIMIT 25 ) AS random_users JOIN view.data_all AS t ON t.user_id = random_users.user_id WHERE facility LIKE '%dallas%' AND rcv_from >= '2020-10-01' AND rcv_from <= '2021-09-30' GROUP BY t.user_id
关键说明
- 子查询优先锁定25个独立用户,确保最终结果必含25个不同的
user_id; - 关联原表时复用过滤条件,避免引入不符合时间或地点要求的记录;
- 若使用其他数据库(如PostgreSQL),只需将
ORDER BY RAND()替换为ORDER BY RANDOM()即可。
内容的提问来源于stack exchange,提问作者K Driscoll
相关产品推荐
相关产品推荐

