如何在仅通过一个查询不知道该值的情况下从 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
子句中,子查询对每一行求值一次,因此每次都会得到不同的值。
让我们假设以下 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
子句中,子查询对每一行求值一次,因此每次都会得到不同的值。