从包含值列表的db列中提取值

时间:2013-06-27 09:30:04

标签: mysql sql database

我有一个db设计

表1

id int(10);
name varchar(25);
cat_id_list varchar(255);

表2

cat_id int(10);
category varchar(50);

选项卡1 - cat_id_list包含tab2中的cat_id列表 我从tab1中选择了一些特定的记录。 我有一组特定的cat_id要忽略。 现在我想在cat_id_list列中删除那些具有特定cat_id的rec。 任何人都可以帮忙

表1

    id      name      cat_id_list
    1       abc       1,2,
    2       ab        3,
    3       xyz       2,3,

表2

    cat_id        category
    1             name1
    2             name2
    3             name3

我想忽略表1中那些在cat_id_list中包含“1”值的记录。

3 个答案:

答案 0 :(得分:2)

将cat放在cat_id_list中时,你在做错了什么。 你应该做的是添加一个第三个表(table3),它将保存table1.id和table2.cat_id,所以在你提供的样本中,表3将有4个记录。

添加FK有助于保持数据的一致性。在FK中,您可以定义删除级联,以清理数据。

答案 1 :(得分:1)

检查here。请注意,存储一组值而不是使用单独的关系(表)进行重新关联很多:很多是不可取的(这个问题说明了原因)。

编辑:实际上,链接是关于MySQL的,但现在我看到你没有指定数据库供应商。但是,所描述的机制是相同的,但在PostgreSQL中的其他DBMS (i.e. unnest(string_to_array(column, 'delimiter'))中可能存在内置过程。

编辑2:一些PHP脚本(既不是最好的,也不是最快的):

$sql = 'SELECT * FROM table1';
$idsToDelete = [];
$value = 1;
while ( $row = mysqli_fetch_array ( $sql ) )
{
    if ( in_array ( $value, explode ( ',', $row [ 'cat_id_list' ] ) )
    {
        $idsToDelete[] = $row [ 'id' ];
    }
}

if ( count ( $idsToDelete ) )
{
    $sql = sprintf ( 'DELETE FROM table1 WHERE id IN ( %s )', implode ( $idsToDelete, ',' ) );
    mysqli_query ( $sql );
}

答案 2 :(得分:0)

这可能效率低下但你可以加入这两个表:

SELECT * From Table_1 
JOIN Table_2 ON CHARINDEX(Cast(Cat_ID AS varchar(255)) + ',',Cat_ID_List) > 0
相关问题