删除具有多个值的sql行,其中ID在另一个表中没有匹配

时间:2014-11-07 17:58:40

标签: mysql

我有两张桌子:

表:选项

Options

Id         xItems

-         ItemA,ItemB,ItemC,etc

表:项目

Items      
    Id
    -

我正在尝试删除Options.xitems

中未列出的所有项目行

我试图执行SQL语句

DELETE FROM items
Where items.id NOT IN (SELECT xitems FROM options) 

然而问题是XItems中包含多个值,我只设法删除Item.Id是第一个或唯一值的行。 非常感谢任何帮助

编辑:以下更新已从OP的帖子中添加为答案。

服务器是MySQL(相应地编辑标签),允许用户输入下面的SQL语句来对任何数据库表执行。我是一个前端开发者,并对这些东西感到困惑。

John,我运行了您发布的代码。以下是我对备份测试表应用的实际代码

DELETE FROM xbak514q_ecom_prodoptionsel
WHERE NOT FIND_IN_SET(xbak514q_ecom_prodoptionsel.id, (SELECT xprodoptionsel FROM xbak514q_ecom_prodoptions))

返回了以下错误:

  

执行提交的SQL语句时遇到问题。   该错误报告为:MySQL扩展遇到问题   提交SQL语句。 MySQL将错误报告为:子查询   返回超过1行

此数据库由设置e-comm网站的软件公司配置。项目,产品选项和选择项目(附加)非常广泛。我应该考虑重新格式化表吗?

再次感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用find_in_set() ??

DELETE FROM items
WHERE NOT FIND_IN_SET(items.id, (SELECT xitems FROM options))

<强> FIDDLE DEMO

注意:

find_in_set()仅适用于MySQL,但由于您已对其进行了标记,因此这可能是也可能不是解决方案。但是该函数查找以逗号分隔的列表,该列表是单个字符串或项目,并将第一个参数作为搜索字符串

建议。

你应该从不将数据存储在数据库中作为逗号分隔的列表......将来会导致巨大问题。请考虑规范化您的数据库。如果你想要一种方法,只需发表评论,我会写一个会为你规范化的查询。