あなたがランダム化する能力を制限する小さな行構造に依存しています。私は、データを "unpivot"してより多くの行を生成し、よりランダムな結果を得ることをお勧めします。小文字の結果セット/テーブルでは大丈夫ですが、大きなセットでは問題ありません。あなたはこのSQL Fiddleを訪問し、任意の "ランダム" を参照して実行]をクリックする必要があります
CREATE TABLE formal
(`id` int, `date` datetime, `name` varchar(5), `d1` int, `d2` int, `d3` int, `d4` int)
;
INSERT INTO formal
(`id`, `date`, `name`, `d1`, `d2`, `d3`, `d4`)
VALUES
(1, '2017-02-10 09:00:00', 'bimal', 1, 1, 1, 1);
クエリ1:
select
*
from (
select id, date, name, d1 colvalue, 'd1' colsource from formal union all
select id, date, name, d2 , 'd2' from formal union all
select id, date, name, d3 , 'd3' from formal union all
select id, date, name, d4 , 'd4' from formal
) p
inner join (
select id, least(d1, d2, d3, d4) as least_value from formal
) lv on p.id = lv.id
where colvalue = least_value # correction here
order by rand()
limit 1
Results:
| id | date | name | colvalue | colsource | id | least_value |
|----|----------------------|-------|----------|-----------|----|-------------|
| 1 | 2017-02-10T09:00:00Z | bimal | 1 | d2 | 1 | 1 |
は、複数行の結果については、IDごとに1:
| id | date | name | colvalue | colsource | least_value | RowNumber | @prev := p.id |
|----|----------------------|-------|----------|-----------|-------------|-----------|---------------|
| 3 | 2017-02-10T09:00:00Z | suman | 1 | d3 | 1 | 1 | 3 |
| 1 | 2017-02-10T09:00:00Z | bimal | 1 | d1 | 1 | 1 | 1 |
| 2 | 2017-02-10T09:00:00Z | amal | 1 | d2 | 1 | 1 | 2 |
select
*
from (
select
p.*
, lv.least_value
, @row_num :=IF(@prev = p.id, @row_num + 1, 1)AS RowNumber
, @prev := p.id
from (
select id, date, name, d1 colvalue, 'd1' colsource from formal union all
select id, date, name, d2 , 'd2' from formal union all
select id, date, name, d3 , 'd3' from formal union all
select id, date, name, d4 , 'd4' from formal
) p
inner join (
select id, least(d1, d2, d3, d4) as least_value from formal
) lv on p.id = lv.id
cross join (
select @row_num := 0, @prev := null
) vars
where colvalue = colvalue
order by p.id, rand()
) d
where rowNumber = 1
;
結果は、私はあなたの質問に従わないthis revised sqlfiddle
を参照してください。ここで何をしようとしていますか? –
'd2'または' d3'カラムを 'd1'カラムではなく' least_column'に設定したいと思います。設定することは可能ですか? –
ケース式の条件内のフィールドの順序は、どのフィールド名が最小値として返されるかを決定します。ケース内のフィールドの順序がランダム化されているsqlを動的に生成できる場合は、受け取ったフィールド名を出力としてランダム化できます。 – Shadow