Re: [SQL ] 將資料項有條件平均分配
SET @r:=0, @s:=null;
UPDATE i1
SET round = (@r := CASE WHEN @s = series OR isnull(@s)
THEN @r+1
ELSE 1 END),
series = (@s := series)
ORDER BY series, rand();
==================
不確定是不是你要的結果
在同樣的 series 裡, round 會從 1 至 n 隨機分配
※ 引述《SmallBeeWayn (喵喵叫的蜜蜂貓)》之銘言:
: 資料庫版本: MySQL 5.1 MyIASM
: 網頁是PHP 5.2 不過不太希望用到就是了
: TABLE Name = `il`
: Index Series Round
: 1 A ?
: 2 A
: 3 A
: 4 B
: 5 B
: 6 C
: 7 A
: 8 A
: 9 B
: 10 C
: 例如上面這樣的資料結構,想要分配Round號碼1~5
: 但希望同一個Series的資料避免分配到同一個Round
: 目前使用的SQL語法如下:
: SET @id=0;
: UPDATE `il` JOIN (SELECT `Index`,(1+(@id:=@id+1)%5) AS `Round`
: FROM (SELECT `Index` FROM `il` ORDER BY `Series`,RAND()) AS `sb`)
: AS `sc` USING (`Index`) SET `il`.`Round`=`sc`.`Round`;
: 但是這樣的語法出現一個問題,例如在這個範例中
: Series B 永遠只能分配到Round 2,3,4, Series C則只能分配到Round 1,5
: 目前想到的改進語法:
: SET @id=0;
: UPDATE `il` JOIN (SELECT `Index`,@id:=@id+1 AS `Round`
: FROM (SELECT `Index` FROM `il` ORDER BY `Series`,RAND()) AS `sb`)
: AS `sc` USING (`Index`) SET `il`.`Round`=`sc`.`Round`;
: SET @id=0;
: UPDATE `il` SET `Round`=(@id:=@id+1) WHERE `Round` BETWEEN 1 AND 5
: ORDER BY RAND();
: SET @id=0;
: UPDATE `il` SET `Round`=(@id:=@id+1) WHERE `Round` BETWEEN 6 AND 10
: ORDER BY RAND();
: 可是這樣的寫法資料庫如果大起來就要跑上一陣子
: 想請問有沒有比較快的作法?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.170.248.102
推
06/16 11:33, , 1F
06/16 11:33, 1F
→
06/16 11:59, , 2F
06/16 11:59, 2F
推
06/16 15:55, , 3F
06/16 15:55, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):