更新mysql表以按比例分配列值

时间:2017-05-02 14:17:10

标签: mysql sql updates

我有一个category列的表格为

category enum('A', 'B', 'C'),

我如何UPDATE整个表格将A分配给1/3行,B到1/3行,C到1/3行(没有特定的顺序)?

3 个答案:

答案 0 :(得分:2)

据推测,这是一次性的事情:

UPDATE table1 SET category = 'A' WHERE category IS NULL ORDER BY RAND() LIMIT X;
UPDATE table1 SET category = 'B' WHERE category IS NULL ORDER BY RAND() LIMIT X;
UPDATE table1 SET category = 'C' WHERE category IS NULL;

其中X是表中总行数的1/3

SELECT FLOOR(COUNT(*) / 3) x FROM table1;

答案 1 :(得分:0)

也许随机分配?假设您有足够的行,导致分布均匀。

CASE ROUND(RAND() * 2,0)
   WHEN 0 then 'A'
   WHEN 1 then 'B'
   WHEN 2 then 'C'
END CASE as Result

答案 2 :(得分:0)

在单个语句中执行此操作的另一个选项,无需事先知道您的记录计数:

   UPDATE table, (select @s:=0) as s 
   SET category = 
       CASE 
           WHEN MOD(@s:=@s+1, 3)=1 THEN 'A' 
           WHEN MOD(@s, 3)=2 THEN 'B' 
           ELSE 'C' 
           END;

使用变量生成行号,然后我们可以使用mod()检查它的值,为其赋予三个值之一。如果您的表上有一个自动增量字段是连续的并且没有删除的行,那么您可以使用该字段而不是变量。