从随机列中选择2条随机记录时,我从不同随机列中获得2条记录
我的桌子
id | name1 | name2 | name3
------------------------------
1 user1 test1 pr1
2 user2 test2 pr2
3 user3 test3 pr3
.............................
n userN testN prN
SELECT CASE FLOOR(RAND()*3+1)
WHEN 1 THEN name1
WHEN 2 THEN name2
WHEN 3 THEN name3
END AS name
FROM names ORDER BY RAND() limit 2
我得到这样的结果:
|name|
----
user1
pr1
但是我需要:
|name|
----
user1
userN
或
|name|
----
pr2
pr5
预先感谢您的回答
答案 0 :(得分:1)
尝试这个:
SELECT
CASE x.r
WHEN 1 THEN name1
WHEN 2 THEN name2
WHEN 3 THEN name3
END AS name
FROM names
CROSS JOIN (SELECT FLOOR(RAND()*3+1) as r) x
ORDER BY RAND() limit 2
由于FROM子句(CROSS JOIN)中的子查询仅被评估一次,因此您将获得一个介于1和3之间的随机值,而不是两个不同的值。这样一来,您总是会从同一(随机)列中获得两个随机行,并带有一个值。
答案 1 :(得分:1)
您可以使用如下查询:
SELECT CASE @COLNR
WHEN 1 THEN name1
WHEN 2 THEN name2
WHEN 3 THEN name3
END AS name
FROM names
CROSS JOIN ( SELECT @COLNR := FLOOR(RAND()*3+1) ) AS INIT
ORDER BY RAND()
LIMIT 2;
或者这样:它将获得最大的行数
SELECT CASE @COLNR
WHEN 1 THEN name1
WHEN 2 THEN name2
WHEN 3 THEN name3
END AS name
FROM names
CROSS JOIN ( SELECT FLOOR( RAND() * COUNT(*)+1) INTO @COLNR from names ) AS INIT
ORDER BY RAND()
LIMIT 2;