我有以下情形:我有一个product_category表,这些表使用这些列管理产品和类别之间的关系:
id,product_id,category_id

我还有另一个表(cat_eq),该表将某些类别与这些类别的另一个类别分组:

id, mykey, source_cat_id, destiny_cat_id


source_cat_id列是存储逗号分隔ID的VARCHAR。例如:12,25

我需要编写一个触发器,该触发器在插入product_category表之前检查new.category_id是否在生成给定mykey的SELECT时产生的集合中,例如:

if(new.category_id in
    (select source_cat_id from cat_eq where clave = 'man') )
then
  set new.category_id:=(select destiny_cat_id from cat_eq where clave = 'man');


当cat_eq具有多个值时,假设(12,15)触发器仅在id_category位于cat_eq表行的第一位时才起作用。

我想要得到的是等效的,它在触发器中可以正常工作:

if(new.category_id in (12,25) )
then
    set new.category_id:=(select destiny_cat_id from cat_eq where clave = 'man');


我怎样才能做到这一点?
谢谢!

最佳答案

认为REGEXP是这里的简单解决方案:

IF EXISTS
  select 1 from cat_eq where clave = 'man' AND
     source_cat_id REGEXP CONCAT('(^|,)', new.category_id, '(,|$)')


基本上,您正在寻找的东西要么以category_id开头,然后是逗号,以逗号开头,接着是category_id,然后是另一个逗号,或者以逗号开头,接着是category_id,然后匹配结尾。

第二种方法可能只是LIKE子句:

select 1 from cat_eq where clave = 'man'
     AND CONCAT(',',source_cat_id,',') LIKE CONCAT('%,',category_id,',%')

关于mysql - 在插入MySql触发器之前,请替换new.id,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46183322/

10-16 11:15