如何使用MySQL从两张表中随机获取指定数量的数据?
正确实现从两个表分别随机取指定数量数据的方法
首先,你用的UNION ALL写法是完全生效的,只要满足一个关键前提:fixed_questions和questions这两个表的列数、对应位置的列数据类型完全一致(因为UNION ALL要求合并的两个结果集结构必须匹配)。如果你的表结构符合这个条件,这条语句就能准确从fixed_questions随机拿1条,从questions随机拿4条,并且把结果合并在一起。
不过为了更清晰(也避免万一表结构有细微差异),可以明确指定列名代替*,比如:
SELECT col1, col2, col3, examid FROM fixed_questions WHERE examid = 15 ORDER BY RAND() LIMIT 1 UNION ALL SELECT col1, col2, col3, examid FROM questions WHERE examid = 15 ORDER BY RAND() LIMIT 4;
至于你尝试的第二个写法:
SELECT * FROM v_fixed_questions vf ,v_questions vq ON (vf.examid = vq.examid)
这其实是一个交叉连接(笛卡尔积),会把两个视图中examid相同的所有行进行两两组合,结果行数是v_fixed_questions中符合条件的行数 × v_questions中符合条件的行数,完全不是你想要的分别随机取指定数量的效果,所以这个写法是不符合需求的。
如果你的两个表结构不一致,没办法直接用UNION ALL,可以考虑用子查询把结果包装成结构一致的形式,比如给缺失的列补默认值:
SELECT id, content, examid, 'fixed' AS source_type FROM fixed_questions WHERE examid = 15 ORDER BY RAND() LIMIT 1 UNION ALL SELECT id, content, examid, 'normal' AS source_type FROM questions WHERE examid = 15 ORDER BY RAND() LIMIT 4;
这样既保证了结果集结构一致,还能区分数据来自哪个表,更实用。
内容的提问来源于stack exchange,提问作者 hasan_007
相关产品推荐
相关产品推荐

