如何在字符串列中查找缺失的数字

wgeznvg7  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(353)

我试图在一个相当大的sql数据集中找到未解释的数字,并且在排序时遇到了一些困难。默认情况下,列的数据读取 'Brochure1: Brochure2: Brochure3:...Brochure(k-1): Brochure(k):' 其中k代表唯一id有资格获得的手册数量。现在问题出现了,因为小册子是一个样本,更新后的数据将读取

'Brochure1: 00001 Brochure2: 00002 Brochure3: 00003....'

如果在诸如00001-88888的数字范围内,一些数字没有在小册子(x)旁边计算,如何查询缺少的数字:

r1zk6ea1

r1zk6ea11#

正确的方法:你应该改变数据库的结构。如果您关心性能,那么应该遵循关系数据库的良好实践,因此问题下面的第一个注解是:normalize。与其将宣传册的信息放在表的一列中,不如创建另一个表来描述宣传册和第一个表名之间的关系,这是一个更快更清晰的解决方案

<your-first-table-name>_id    | brochure_id
----------------------------+---------------
1                           | 00002
1                           | 00038
1                           | 00281
2                           | 28192
2                           | 00293
...                         | ...

更不用说,如果可能的话-你应该把你的id当作整数,所以用12代替0012。
这里的区别是,现在您可以进行高效而简单的查询,以找出第一个表中的一个id有多少个小册子,或者任何小册子属于哪个id。如果出于某种原因,您需要保留每个手册的序号,您可以在上表中添加一列,如手册编号。
你想要达到的目标(不推荐):我认为在不改变数据库结构的情况下实现你的目标最快的方法是获得你的手册栏的价值,然后用你的脚本处理它。您确实不希望创建sql语句来解析此类数据。在php中,wolud看起来像这样:

// Let's assume you already have your `brochures` column value in variable $brochures

$bs = str_replace(": ", ":", $brochures);
$bs = explode(" ", $bs);
$brochures = array();
foreach($bs as $b)
    $brochures[substr($b, 8, 1)] = substr($b, strpos($b, ":")+1, 5);

// Now you have $brochures array with keys representing the brochure number, 
// and values representing the ID of brochure.

if(isset($brochures['3'])){
    // that row has a defined Brochure3
}else{
    // ...
}

相关问题