mysql - 使用 SQL RAND() 生成受约束的 DISTINCT 元素

标签 mysql sql random unique distinct

我有一个 SQL (MySQL SQL) 语句,如下所示,从表 bar 中获取 10 条记录:

SET @foo:=1;
SELECT DISTINCT
    @start:=ROUND(RAND()*100),
    @start+ROUND(RAND()*100)+1,
    CONCAT("id-",@foo:=@foo+1)
FROM
    bar
LIMIT 10

它生成独特的元素,例如:

...
14   72   id-2
...
9    10   id-8
...

到目前为止,还不错。但我真正想做的是以一种不添加重复项的方式使用 DISTINCT 关键字,仅基于第一列或第一列和第二列值的唯一性.

例如,目前所有10条记录都是唯一的,因为每条记录的id-n元素总是不同的。所以这是可能的:

...
9    10   id-4
...
9    10   id-8
...

我想做的是让第二个 9 10 id-8 元素不在结果集中(或者,9 10 id-4 —我不在乎遗漏了哪些近似重复项)。有没有办法将 DISTINCT 限制在第一列或第一列和第二列?

我知道我可以从 SQL 语句中省略 id-n 值,然后使用下游脚本对结果进行后处理,将其添加回去。但是,出于好奇,我我想找到包含在 SQL 查询中的解决方案。谢谢!

最佳答案

好吧,我不是 100% 确定这就是您要尝试执行的操作,但您似乎可以将查询结果放在子查询中,然后使用 MAX 获取最后记录。

也许是这样的:

SELECT rand1col, rand2col, CONCAT("id-",Max(fooidcol)) as col3
FROM 
(
    SELECT DISTINCT
        @start:=ROUND(RAND()*100) as rand1col,
        @start+ROUND(RAND()*100)+1 as rand2col, 
        @foo:=@foo+1  as fooidcol
    FROM bar
) t
GROUP BY rand1col, rand2col
LIMIT 10

测试这个的问题是 RAND() 不会返回我测试需要的东西,所以我创建了这个 SQL Fiddle实际的列试图做到这一点,但它似乎也适用于上述查询。

这里是 Fiddle使用上述查询 - 有时有效,只需保持刷新即可。

关于mysql - 使用 SQL RAND() 生成受约束的 DISTINCT 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14370005/

相关文章:

php - MariaDB 远程访问

MySQL 1050 表不存在,但 MySQL 认为它存在

php - SQL-内连接和积

sql - 如何创建特定大小的 SQL Server 地理多边形?

R 中向量的随机数生成器

node.js - 如何通过标签向 Imgur API 请求随机图像?

iphone - Objective C 中 float 的随机范围?

mysql - 在 MySQL 中向表中插入数据时出现错误

mysql - php mysql 获取结果

sql - 使用 "where id in"时如何返回前 2 条记录