2017-09-12 25 views
0

を置き換えますそのグループのこれらの列と別のカテゴリといくつかのカテゴリ:は、私は次のシナリオを持っているnew.id

id, mykey, source_cat_id, destiny_cat_id 

source_cat_id列はカンマでIDを分離保管VARCHARです。

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'); 
:例えば:私は product_categoryテーブルチェックに挿入する前に new.category_idは、例えば、いくつかの にmykeyを与え SELECTを行うとき、その結果セット内にある場合にトリガーを作成する必要があり12,25

cat_eqに複数の値がある場合、id_categoryがcat_eqのテーブル行の最初の位置にある場合にのみトリガーが機能するとします(12,15)。私が取得したい何

はウィッヒがトリガーで[OK]を動作しますが、これと同等です:

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

はどうすればこれを行うことができますか? ありがとう!

+3

あなたがする必要がある最初の事はあなたのデータモデルを修正しています。決してコンマで区切られたリスト(受信レコードを処理するステージングテーブルを除く)を格納する必要はありません。これは関連するテーブルでなければなりません。 – HLGEM

+0

@HLGEM理論的には素晴らしいですが、しばしば実用的ではありません。たとえば、CMSは、最適でない場合でも、開発者を特定のスキーマにロックしています。 – cwallenpoole

+2

'FIND_IN_SET()'は、悪いデザインの良い機能です。 –

答えて

2

は、REGEXPは、ここに簡単な解決策だと思う:基本的に、あなたはCATEGORY_IDで始まり、その後にカンマが続いているいずれかの何かのため

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

探している、カンマで始まるCATEGORY_IDが続いています別のカンマ、またはカンマで始まり、category_idが続き、最後にマッチします。

第2のアプローチは、ちょうどLIKE句であるかもしれない:

select 1 from cat_eq where clave = 'man' 
    AND CONCAT(',',source_cat_id,',') LIKE CONCAT('%,',category_id,',%') 
関連する問題