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

时间:2013-01-16 23:51:28

标签: 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查询中包含的解决方案。谢谢!

1 个答案:

答案 0 :(得分:1)

好吧,我不是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 - 在某些时候有效,只需保持刷新。