首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从列中具有相同但随机值的表中选择行,而不知道该值只有一个查询?

如何从列中具有相同但随机值的表中选择行,而不知道该值只有一个查询?
EN

Stack Overflow用户
提问于 2017-05-26 10:40:49
回答 1查看 39关注 0票数 0

让我们假设下表和数据:

代码语言:javascript
复制
CREATE TABLE `test_abc` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `val_abc` INT UNSIGNED NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
);
INSERT INTO test_abc (val_abc) VALUES
(1), (2), (1), (1), (3), (2), (3), (2), (3), (3), (3);

id | val_abc
------------
1  | 1
2  | 2
3  | 1
4  | 1
5  | 3
6  | 2
7  | 3
8  | 2
9  | 3
10 | 3
11 | 3

现在,我希望选择所有具有相同val_abc的行,而不管是哪个val_abc --但是由于不应该总是相同的行,所以需要有一个随机因素。所以基本上是随机的,所有行都有val_abc = 1,或者所有行都有val_abc = 2,等等。val_abc的值可以是任何东西(甚至是非数字的),并且在代码级别上是未知的。例如,预期结果如下:

代码语言:javascript
复制
id | val_abc
------------
2  | 2
6  | 2
8  | 2

id | val_abc
------------
5  | 3
7  | 3
9  | 3
10 | 3
11 | 3

当然,我可以问两个问题。一种是获得val_abc的随机但存在的值,例如SELECT val_abc FROM test_abc ORDER BY RAND() LIMIT 1。然后再进行第二个查询,以获取val_abc中具有此特定值的所有行。

第二种可能是使用子查询,如SELECT * FROM test_abc WHERE val_abc = (SELECT val_abc FROM test_abc ORDER BY RAND() LIMIT 1)。但这实际上是行不通的(MariaDB 5)。结果似乎是完全随机的,每次(1行、5行、3行、混合val_abc值等等),我还没有完全理解。看起来,RAND和LIMIT组合的ORDER在子查询中不会像预期的那样工作。

是否有可能通过一个子选择,甚至一个没有子查询的查询来实现这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-26 10:42:58

将比较移到FROM子句:

代码语言:javascript
复制
SELECT t.*
FROM test_abc t JOIN
    (SELECT val_abc FROM test_abc ORDER BY RAND() LIMIT 1) trand
     ON t.val_abc = trand.val_abc;

FROM子句中的子查询只计算一次,因此只能得到一行。在WHERE子句中,对每一行计算一次子查询,因此每次都得到不同的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44199491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档