我有以下场景:我有一个product_category表,用于管理这些列的产品和类别之间的关系: id,product_id,category_id
我有另一个表(cat_eq),它将某些类别与另一个类别组合在一起:
id, mykey, source_cat_id, destiny_cat_id
source_cat_id
列是VARCHAR
,用于存储以逗号分隔的ID。例如:12,25
我需要编写一个触发器,在插入product_category
表之前检查new.category_id
是否在SELECT
给出一些 mykey ,例如:
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');
我该怎么做? 谢谢!
答案 0 :(得分:2)
认为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,',%')