我有一个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”值的记录。
答案 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