Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何从列中具有相同但随机值的表中选择行,而不知道只有一个查询的值?_Mysql_Sql_Mariadb - Fatal编程技术网

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

Mysql 如何从列中具有相同但随机值的表中选择行,而不知道只有一个查询的值?,mysql,sql,mariadb,Mysql,Sql,Mariadb,让我们假设下表和数据: 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

让我们假设下表和数据:

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的随机但存在的值,例如,从test_abc ORDER BY RAND LIMIT 1中选择val_abc。然后是第二个查询,以获取val_abc中具有此特定值的所有行

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


是否有可能通过子选择或甚至不使用任何子查询的查询来实现这一点?

将比较移到FROM子句:


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

Ok,我明白了。现在我明白了我在子查询中得到的奇怪结果。
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;