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

update 25 % of total rows returned by a select query

我必须将数据插入包含列(第 1 列、第 2 列、第 3 列)的 table。

我有一个 select 查询 select 要插入到此 table 中的数据。

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'  ...

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

任何人都可以对此提出建议吗?

我正在使用 MYSQL

使用子查询获取总行数。然后使用用户定义的变量获取输出中的行号,并将其与总数的 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

插入数据时table,保留行号,取模:

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.

数据以某种方式排序也是如此