我有一个 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/