更新选择查询返回的总行数的25%

时间:2015-04-13 20:05:04

标签: mysql sql-update logic limit

我必须将数据插入到包含列(col 1,col2,col 3)的表中。

我有一个选择查询来选择要在此表中插入的数据。

Select A.id, b.id , '1' 
from table a 
inner join table b on a.id=b.id
where a.col= 'somevalue'and b.col ='othervalue'  ...

如果您注意到选择陈述中的第三列,我的硬编码值为“1”。当前的要求是仅将总行的25%设置为“1”,将剩余的75%设置为“0”。现在困难的部分是我们无法确定select语句会产生多少行。 我们还可以使用update语句将25%的行更新为1,并将其保持为“0”,但限制功能将不接受任何用户定义的变量。

有人可以对此提出一些建议吗?

我正在使用MYSQL

2 个答案:

答案 0 :(得分:0)

使用子查询获取总行数。然后使用用户定义的变量来获取输出中的行号,并将其与总数的25%进行比较。

SELECT a.id, b.id, IF(@counter < pct25, '1', '0'), @counter := @counter + 1
FROM table1 a
JOIN table2 b ON a.id = b.id
JOIN (SELECT COUNT(*)/25 AS pct25
      FROM table1 a
      JOIN table2 b ON a.id = b.id) AS x
CROSS JOIN (SELECT @counter := 0) AS var

答案 1 :(得分:0)

将数据插入表中时,请保留行号,并使用模运算:

insert into . . .
    select a_id, b_id, (mod(rn, 4) = 0) as flag
    from (Select A.id as a_id, b.id as b_id , (@rn := @rn + 1) as rn
          from table a inner join
               table b
               on a.id = b.id cross join
               (select @rn := 0) vars
          where a.col = 'somevalue' and b.col = 'othervalue'  ...
         ) i;

采取每四行的一个很好的特点是,这很有效,即使数据因join而以某种方式排序。