2012-05-29 159 views
0

匹配sustring我有一个名为“MyProjects下”表和一个与“权利”。现在我有以下行删除查询,而在MySQL

id =>1 

rights => 7,4,34,532,12,32 

现在我需要删除该行如果任何指定的列数在权限列呈现以下 值

2,4,65,34 

正如你可以看到4存在于列中的值,所以我需要删除该行。 有人可以告诉我这个MySQL的查询或功能? 它可以通过服务器端脚本来实现应用的循环,但我需要一个优化的解决方案 感谢

+5

在我看来,你可能在你的数据库中有一个“错误”的设计。这里似乎是一个一对多的关系应该由另一个“权利”表的外键“Myprojects_id”映射的MyProjects的ID字段和右场被定义为只含权的整数(例如,你将有6项喜欢:1,7 1,4 1,34 1,12 1532 1,32用于存储MYPROJECT 1权益7,4,34,532,12,32),那么SQL查询将只是一个巨大或者查询 – daghan

+0

@daghan:使用你提出的结构中,'DELETE'语句可以更有效地表达比“一个巨大或者查询”使用['IN'](http://dev.mysql.com/doc/en/comparison-operators.html# function_in)运算符:'DELETE FROM MyProjects下JOIN MyProjects下ON rights.Myprojects_id = MYprojects.id WHERE rights.right IN(2,4,65,34)的权限;'。请注意,这种方法需要与定义外键关系'从'rights'表,而这又需要使用InnoDB存储引擎的删除CASCADE'以清除所有记录。 – eggyal

+0

为了完整起见,没有InnoDB /外键关系,为了执行清理,可以再次将'rights'表加入到'DELETE'查询:'DELETE Myprojects,allrights FROM MYprojects JOIN rights ON权限。 Myprojects_id = MYprojects.id JOIN AS ALLRIGHTS权利allrights.Myprojects_id = MYprojects.id WHERE rights.right IN(2,4,65,34);'。 – eggyal

回答

0

可以使用MySQL的FIND_IN_SET()功能(如果Rights列使用SET数据类型存储,这将是特别有效):

DELETE FROM MYprojects WHERE 
    FIND_IN_SET(2, Rights) 
    OR FIND_IN_SET(4, Rights) 
    OR FIND_IN_SET(65, Rights) 
    OR FIND_IN_SET(34, Rights) 

然而,正如daghan comments,你应该考虑更适合的数据结构,利用MySQL的关系数据库管理功能。

0
DELETE FROM `MYprojects` WHERE `rights` REGEXP '(^|,)2($|,)' OR `rights` REGEXP '(^|,)4($|,)' OR `rights` REGEXP '(^|,)65($|,)' OR `rights` REGEXP '(^|,)34($|,)' 

是我能想到做最巧妙的方法。正则表达式确保输入的数字是列表的一部分,而不仅仅是另一个数字的一​​部分(例如'1'不匹配'11')。如果你通过脚本来完成查询,它确实需要一些循环来构建查询,但与大多数情况相比,它是最小的。