mysql - 删除具有多个值的 SQL 行,其中 ID 在另一个表中不匹配

标签 mysql

我有两个表:

表:选项

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/

相关文章:

mysql - 在 Eloquent 中按类别列出用户的产品

MYSQL 查询替换字符串的一部分

mysql - Bash 脚本不在 CRON 中执行(可能与 Sudo 命令有关?)

mysql - 动态sql,如何将查询结果保存到新表中?

MYSQL NOT IN subselect 查询

MySQL 字段分隔符 - ASCII、Unicode

mysql - Play Framework 2.5 - 不使用内存数据库进行测试

php - 没有为表单中的文件创建目录

MySQL join 是扫描表而不是使用索引

php - 从php脚本插入语句到mysql : Database not reading insert statement