让我们假设下表和数据:
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的值可以是任何东西(甚至是非数字的),并且在代码级别上是未知的。例如,预期结果如下:
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在子查询中不会像预期的那样工作。
是否有可能通过一个子选择,甚至一个没有子查询的查询来实现这一点?
发布于 2017-05-26 10:42:58
将比较移到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子句中,对每一行计算一次子查询,因此每次都得到不同的值。
https://stackoverflow.com/questions/44199491
复制相似问题