mysql - 随机派生表中的随机行
问题描述
我有一组表,我想从其中一个随机表中选择一个随机行。
如果有 5 张桌子
Table1
Table2
Table3
Table4
Table5
每个都有相同的数据格式。
我已经尝试过以下方法,选择随机表的第一部分有效,但从表中获取信息返回 0 行。
SELECT * FROM (SELECT `cat_table_name` from `category-defines` GROUP BY `cat_table_name` LIMIT 1) AS x ORDER BY RAND() LIMIT 3
解决方案
并非每项任务都可以在单个 SQL 查询中完成。
在 SQL 中,所有表名(实际上是所有标识符)都必须在解析查询时固定。您不能编写一个 SQL 查询来根据查询期间评估的表达式来选择表(或列等)。
以此类推:就像在任何其他代码中一样,尝试调用一个名称基于您要调用的函数的返回值的函数。
所以你不能在一个查询中做你想做的事。
您可以在一个查询中选择随机表名,然后在形成下一个查询时使用该结果。
SELECT `cat_table_name` from `category-defines` GROUP BY `cat_table_name` LIMIT 1
SELECT * FROM `$result_from_previous_query` ORDER BY RAND() LIMIT 3
这是最简单的解决方案。
请务必用反引号分隔您的表名,以防表名之一是FROM
或其他保留关键字。
(注意:上面的第一个查询不会随机选择表名,它总是选择第一个表)。
上面的评论建议使用所有表的 UNION。这就是它的样子:
SELECT *
FROM
(SELECT FLOOR(RAND()*5)+1 AS table_num) AS r
JOIN (
(SELECT 1 AS table_num, * FROM my_table1 ORDER BY RAND() LIMIT 3)
UNION
(SELECT 2 AS table_num, * FROM my_table2 ORDER BY RAND() LIMIT 3)
UNION
(SELECT 3 AS table_num, * FROM my_table3 ORDER BY RAND() LIMIT 3)
UNION
(SELECT 4 AS table_num, * FROM my_table4 ORDER BY RAND() LIMIT 3)
UNION
(SELECT 5 AS table_num, * FROM my_table5 ORDER BY RAND() LIMIT 3)
) AS x USING (table_num)
但这至少有两个问题:
- 它承担了从每个表中选择随机行的性能成本,只是为了丢弃其中的大部分。浪费。
- 您仍然必须提前知道表名,因此如果它们不固定,您最终会在此之前运行另一个查询以获取表名列表。
推荐阅读
- python - 运行时错误设置 secret_key 错误 Flask
- angular - 如何解决这个 Angular 7“检测到循环依赖”警告
- asp.net - 如何使用 IIS 7 将两个不同的 asp.net Web 应用程序发布到单个网站
- javascript - 按列表中的顺序对 html DOM 元素进行排序
- sql - 如何在 BigQuery 的一列/行中合并多行值
- graphql - 向 graphql 客户端添加多个标头(apollo-boost)
- mysql - 如何计算多列的平均值并在sql server中排除零
- return-value - GNU屏幕结束时如何使GNU屏幕返回最后一个返回码
- sap - ngdbc.jar(2.4.67 或更高版本)是否支持 JRE 11?
- c# - 为什么 openfiledialog 在第二次选择文件后显示“路径不存在”或“灾难性错误”?