MySQL从列中缺少值

时间:2015-08-18 12:20:28

标签: mysql

 Radio_ID | Log_ID
 ----------------- 
 1        | 1 
 1        | 2 
 1        | 4 
 1        | 7 
 1        | 10
 2        | 1
 2        | 2
 2        | 3
 2        | 5

是否可以在单个sql语句中获得以下输出?

输出:

Radio_ID | Log_ID
-----------------
 1       | 3
 1       | 5
 1       | 6
 1       | 8
 1       | 9
 2       | 4

逻辑:返回每个id的缺失值< id的最大值(ex 10是radio id 1的最大值,缺失值是3,5,6,8,9)。 我有一个无线电设备的数据解析器,当无线电在覆盖范围之外时,它不发送数据,所以我必须发送一个丢失Log_ID的新请求。

谢谢!

1 个答案:

答案 0 :(得分:3)

我假设您有一个名为numbers的表,其中包含足够范围的整数。

然后你可以这样做:

select r.radio_id, n.n as MissingLogId
from (select radio_id, min(log_id) as minli, max(log_id) as maxli
      from table t
      group by radio_id
     ) r join
     numbers n
     on n.n between r.minli and r.maxli left join
     table t
     on t.radio_id = r.radio_id and t.log_id = n.n
where t.radio_id is null;

我们的想法是使用join为每个无线电ID(最小和最大ID之间)生成所有数字。然后过滤掉现有值。

如果你没有方便的数字表,你需要创建一个足够大的表。这可能会奏效:

create table numbers (n int primary key);

insert into numbers(n)
    select (@rn := @rn + 1) as n
    from table cross join (@rn := 0);