如何在仅通过一个查询不知道该值的情况下从 table 中的 select 行中提取具有相同但随机值的列?

How to select rows from a table with identical but random values in a column without knowing that value with only one query?

让我们假设以下 table 和数据:

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

现在我想 select 所有具有相同 val_abc 的行,虽然它是哪个 val_abc 并不重要 - 但因为它不应该总是相同的第一,需要有一个随机因素。因此,基本上随机地选择所有带有 val_abc = 1 的行或所有带有 val_abc = 2 的行,依此类推。 val_abc 的值可以是任何值(甚至非数字)并且在代码级别是未知的。预期结果将是,例如:

id | val_abc
------------
2  | 2
6  | 2
8  | 2

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

当然,我可以提出 2 个查询。一个是获取随机但现有的值 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 值等等),我还没有完全理解。看起来 ORDER BY RAND 和 LIMIT 的组​​合不能像预期的那样在子查询中工作。

是否有可能通过子 select 或者甚至没有任何子查询的查询来实现?

将比较移至 FROM 子句:

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 子句中,子查询对每一行求值一次,因此每次都会得到不同的值。