MySQL使用JOIN关联查询时如何从指定表中随机选取pid记录
问题解答
现有写法有效性判断
你当前提供的SQL写法可以满足你当前场景的需求,该场景指:仅查询uid=p1的用户关联数据,从Packages表中随机选取2个符合关联条件的pid。
逻辑说明:
- 先通过INNER JOIN关联两张表,WHERE条件过滤出
uid=p1的用户对应的所有关联Packages记录 - 用
ORDER BY RAND()对过滤后的所有关联记录做随机排序 - 用
LIMIT 2取排序后的前2条,最终得到的就是p1用户对应的随机2个pid的完整记录
拓展场景实现(多用户分别随机取指定数量pid)
如果你的需求是需要为每个符合条件的Users表用户,分别随机取N个关联的pid,现有写法就不适用了,需要根据你的MySQL版本选择对应实现:
MySQL 8.0及以上版本(窗口函数实现)
SELECT u.*, p.* FROM ( SELECT u.*, p.*, -- 按用户uid分组,组内随机排序生成行号 ROW_NUMBER() OVER (PARTITION BY u.uid ORDER BY RAND()) AS rn FROM users u INNER JOIN packages p ON u.uid = p.puid -- 这里可以加全局过滤条件,比如只要p1、p2用户就加 WHERE u.uid IN ('p1','p2') ) t -- 每个用户取前2条随机记录 WHERE t.rn <= 2;
MySQL 5.x版本(子查询实现)
SELECT u.*, p.* FROM users u INNER JOIN packages p ON u.uid = p.puid WHERE ( SELECT COUNT(*) FROM packages p2 WHERE p2.puid = u.uid AND RAND() < (2 / (SELECT COUNT(*) FROM packages p3 WHERE p3.puid = u.uid)) ) <= 2 -- 可选:按用户uid排序方便查看结果 ORDER BY u.uid;
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

