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

时间:2018-07-10 10:21:39

标签: mysql sql

我正试图在相当大的SQL数据集中找到无法解释的数字,并且面临一些排序困难。 默认情况下,列的数据读取

'Brochure1: Brochure2: Brochure3:...Brochure(k-1): Brochure(k):'

其中k代表具有唯一ID的小册子数量。 现在出现了问题,因为小册子占了一个样本,更新后的数据将显示为

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

如果在00001-88888的数字范围内,还没有考虑到小册子(X)旁边的数字,如何查询缺失的数字:

1 个答案:

答案 0 :(得分:1)

正确的方法: 您应该更改数据库的结构。如果您关心性能,则应遵循关系数据库的良好做法,因此在您的问题下的第一条评论中说: normalize 。与其将有关小册子的信息放置在表格的一栏中,它是一种更快,更清晰的解决方案来创建另一张表格,该表格将描述小册子与您的第一张桌子的名字

之间的关系。
<your-first-table-name>_id    | brochure_id
----------------------------+---------------
1                           | 00002
1                           | 00038
1                           | 00281
2                           | 28192
2                           | 00293
...                         | ...

如果有可能,请不要提及-您应该将Brochure_id视为整数,因此请使用 12 而不是 0012

此处的区别在于,现在您可以进行高效且简单的查询,以查找第一个表中一个ID包含多少个小册子,或者任何小册子属于哪个ID。如果出于某些原因需要保留每本小册子的序号,可以在上表中添加一列,例如 brochure_number


您想要实现的目标(不推荐):我认为在不更改数据库结构的情况下实现目标的最快方法是获得您的
胸针的价值列,然后使用您的脚本对其进行处理。您真的不想创建一个SQL语句来解析这种数据。在PHP中,这种糊涂看起来像这样:

// 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{
    // ...
}