1

我有一个数据库设计

表格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 的记录。谁能帮忙

表格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”值的那些记录。

4

3 回答 3

2

将 id 保存在 cat_id_list 中时,您在这里做错了。您应该做的是添加第三个表 (table3),它将保存 table1.id 和 table2.cat_id,因此在您提供的示例中表 3 将有 4 条记录。

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

于 2013-06-27T09:45:10.370 回答
1

在这里检查。请注意,不建议存储一个值数组而不是使用单独的关系(表)来表示关系 many:many(这个问题说明了原因)。

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

编辑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 );
}
于 2013-06-27T09:43:52.763 回答
0

这可能效率低下,但您可以在以下位置加入这两个表:

SELECT * From Table_1 
JOIN Table_2 ON CHARINDEX(Cast(Cat_ID AS varchar(255)) + ',',Cat_ID_List) > 0
于 2013-06-27T10:25:03.467 回答