我有两个表:
表:选项
Options
Id xItems
- ItemA,ItemB,ItemC,etc
表:项目
Items
Id
-
我正在尝试删除 Options.xitems 中未列出的所有 Items 行
我尝试执行 SQL 语句
DELETE FROM items
Where items.id NOT IN (SELECT xitems FROM options)
但是问题是 XItems 中包含多个值,我只能删除 Item.Id 是第一个或唯一值的行。 将不胜感激任何帮助
编辑:从OP的帖子中添加以下更新作为答案。
服务器是 MySQL(相应编辑标签),它允许输入下面的 SQL 语句来针对任何数据库表执行。我是一名前端开发人员,对这些东西感到困惑。
约翰,我运行了你发布的代码。这是我针对备份测试表应用的实际代码
DELETE FROM xbak514q_ecom_prodoptionsel
WHERE NOT FIND_IN_SET(xbak514q_ecom_prodoptionsel.id, (SELECT xprodoptionsel FROM xbak514q_ecom_prodoptions))
返回以下错误:
A problem was encountered while executing the SQL statement submitted. The error was reported as: The MySQL extension encountered a problem submitting an SQL statement. MySQL reported the error as: Subquery returns more than 1 row
该数据库是由一家建立电子商务站点的软件公司配置的。项目、产品选项和选择项目(附加组件)非常广泛。我应该考虑重新格式化表格吗?
再次感谢您的热心帮助
最佳答案
您尝试过使用find_in_set()
吗?
DELETE FROM items
WHERE NOT FIND_IN_SET(items.id, (SELECT xitems FROM options))
<强> FIDDLE DEMO
注意:
find_in_set()
仅适用于 MySQL,但由于您已将其标记为两者,因此这可能是也可能不是解决方案。但是该函数查找逗号分隔的列表,该列表是单个字符串或项目,并将第一个参数作为搜索字符串
建议。
您不应该永远将数据作为逗号分隔列表存储在数据库中。这会在将来导致巨大问题。请考虑标准化您的数据库。如果您想要一种方法来做到这一点,只需发表评论,我会编写一个查询来为您标准化它。
关于mysql - 删除具有多个值的 SQL 行,其中 ID 在另一个表中不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26807234/