2017-04-05 9 views
2

私の関数はItemsテーブルから一意の組み合わせを生成し、list変数に格納します。生成の最後には、結果としてlistが返され、アプリケーションはすべての組み合わせを処理します。Comboテーブルに保存されます。MySQLで変数を選択する際の重複を防ぐ

、プロセスの第二段階に充填つつあるComboと呼ばれる別のテーブルからの重複のために毎回確認通報

(アプリケーションによってではなく、関数自体によっては)

しかし、それは新たに生成された組み合わせを挿入する前に、list変数の中の重複をチェックしません。

私は、結果自体の中に重複を持つ関数から結果を得ています。例えば。 3423は結果でここに2回表示されます:

3410;3463;3423;3489;3446;3445;3417;3436;3497;3454;3491;3420;3502;3496;3458;3493;3439;3499;3497;3487;3486;3504;3458;3501;3503;3441;3443;3453;3508;3474;3469;3497;3508;3433;3451;3449;3422;3453;3428;3475;3474;3458;3480;3422;3488;3432;3501;3414;3425;3444;3509;3502;3440;3422;3472;3501;3477;3483;3449;3480;3456;3463;3493;3476;3479;3425;3485;3464;3410;3434;3488;3504;3439;3423;3434;3486;3448;3456;3496;3413;3428;3482;3439;3437;3473;3420;3439;3470;3463;3494;3415;3442;3428;3500;3488;3478;3475;3417;3472;3463 

どのように私は、挿入前に重複のlist自身が確認することができますか?

詳細

My機能:

ように見える
SELECT gen_n_uniq_perms_by_cat(1, 100, 1, 45, 1, 120, 20) as comb 

BEGIN 

SET @result := ""; 


SET @counter := 0; 

iterat : 
LOOP 
    SELECT 
     gen_uniq_perm_by_cat(
      permSize , 
      user_id , 
      catID , 
      itemType , 
      tsc_id , 
      tries 
     ) INTO @combo; 


IF(ISNULL(@combo)) THEN 
    RETURN @result; 


ELSE 

SET @result := CONCAT_WS(';' ,@result ,@combo); 


END 
IF; 


SET @counter := @counter + 1; 


IF @counter > permCount THEN 
    RETURN @result; 


END 
IF; 


END 
LOOP 
    iterat; 


END 

gen_uniq_perm_by_cat次のようになります。

BEGIN 
    iterat : 
LOOP 
    SELECT 
     SUBSTRING_INDEX(
      GROUP_CONCAT(`id` ORDER BY RAND() SEPARATOR '-') , 
      '-' , 
      permSize 
     ) INTO @list 
    FROM 
     `Item` 
    LEFT JOIN `ItemCategory` ON `Item`.`id` = `ItemCategory`.`itemID` 
    WHERE 
     (`Item`.`user_id` = user_id) 
    AND(`ItemCategory`.`catID` = catID) 
    AND(`Item`.`type` = itemType); 


SET @md5 := MD5(CONCAT_WS('-' , @list , tsc_id)); 


IF(
    SELECT 
     count(*) 
    FROM 
     `Combo` 
    WHERE 
     `Combo`.`hash` = @md5 
    LIMIT 1 
) = 0 THEN 
    RETURN @list; 


END 
IF; 


SET tries := tries - 1; 


IF tries = 0 THEN 
    RETURN NULL; 


END 
IF; 


END 
LOOP 
    iterat; 


END 

がユニーク(決してCRを生成し、次の引数で過去)の組み合わせでeated:

permSize = 1 
permCount =100 
user_id = 1 
catID = 45 
itemType = 1 
tsc_id = 120 
tries = 20 
+0

私はあなたが何をしようとしているのか分かりません。しかし、 'GROUP_CONCAT(DISTINCT ...)'は重複したIDを削除します。 –

+0

@PaulSpiegel私がしたいのは、新しい組み合わせを挿入する前にduplicateの 'list'変数をチェックすることです。重複がある場合は、 'permCount'の数の組み合わせが得られるまでループを続けます。 '試行'を行うと、(listやComboのテーブル内にない)一意の組み合わせを選ぶことができなくなり、終了します。 – demonoid

+0

クエリを再度実行する代わりに重複を削除するのは間違いでしょうか? –

答えて

1

この目的のために使用NOT LIKE。あなたのケースでは、対応する条件行を次のように置き換えてください:

IF(ISNULL(@combo)) THEN 
    RETURN @result; 
END IF; 


IF(@result NOT LIKE CONCAT('%' , @combo , '%')) THEN 
    SET @result := CONCAT_WS(';' ,@result ,@combo); 
    SET @counter := @counter + 1; 
END IF; 


IF @counter = permCount THEN 
    RETURN @result; 
END IF; 
関連する問題