Re: [SQL ] 將資料項有條件平均分配

看板Database作者 (NeverEver)時間15年前 (2010/06/16 09:10), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串2/2 (看更多)
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
這樣應該round分配會不平均吧?
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
文章代碼(AID): #1C62IIzV (Database)
文章代碼(AID): #1C62IIzV (Database)