我在产品的mysql表中有几千个产品。
每个产品的制造商[制造商]都有一个字段存储为整数 - 制造商' id'。
随着时间的推移,一些制造商已经从“制造商”中删除了。表,但产品已被孤立。
我是否可以运行将删除所有孤立产品的查询。
像
这样的东西'删除products.manufacturer不匹配的所有产品 manufacturers.id'
另一个复杂因素。一个产品可以有多个制造商,所以products.manufacturer可以有这样的数据' 1 | 75 | 432' 其中每个制造商都有1,75,432个。
由于
答案 0 :(得分:0)
试试这个,
DELETE FROM product
WHERE product_id not in (
SELECT distinct p.product_id FROM Product p, manufacturer m
WHERE p.manufacturer REGEXP '[[:<:]]' + m.manufacturer_id + '[[:>:]]'
);
PS:这将仅删除那些已删除列表中所有制造商的记录
答案 1 :(得分:0)
您可以将FIND_IN_SET与REPLACE
结合使用DELETE
p
FROM
products p
LEFT JOIN
manufacturer m
ON
FIND_IN_SET(m.id, REPLACE(p.manufacturer, '|', ','))
WHERE
m.id IS NULL
<强>解释强>
您必须使用FIND_IN_SET使用的唯一限制器|
替换限制器,
,首先是逗号{{1}}。如果制造商表中没有匹配的制造商,那么制造商表的id列的值将为NULL。
请参阅DELETE语法:
前面的示例使用INNER JOIN,但使用多表DELETE 语句可以使用SELECT语句中允许的其他类型的连接, 例如LEFT JOIN。例如,删除t1中存在的行 在t2中没有匹配,请使用LEFT JOIN:
删除t1 FROM t1 LEFT JOIN t2 ON t1.id = t2.id WHERE t2.id IS NULL;
请参阅this fiddle了解SELECT语句。
注意强>
正如我在评论中所说,改变数据库设计会更好。一个产品可以有几个制造商,一个制造商可以生产许多产品,junction table的经典案例。
答案 2 :(得分:0)
你应该做很多初步的事情:
1)更改表格设计,标签限制多个值不是很好 这个想法,事实上在你必须加入其价值的情况下。Sol:更改manufacturer_id以仅容纳单个值(FK 与制造商ID表)。
2)你需要一些脚本来插入不同的多行 标签值。
无论如何,你需要这个来保留记录。
3)现在我们来指出我们可以加入制造商和产品表。
您现在可以在制造商处进行左连接产品,以便有效地执行其他任务。