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
本身插入前重複?
詳細
我的功能:
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通過以下參數進行組合:
permSize = 1
permCount =100
user_id = 1
catID = 45
itemType = 1
tsc_id = 120
tries = 20
我不知道你在做什麼。但'GROUP_CONCAT(DISTINCT ...)'將刪除重複的ID。 –
@PaulSpiegel我想要做的就是在插入新組合之前檢查'list'變量是否有重複項。如果有重複,則繼續循環直到獲得'permCount'組合數。如果'嘗試'我們沒有選擇唯一的組合(這不在'list'或'Combo'表內),那麼我們就退出了。 – demonoid
因此,刪除重複項而不是再次執行查詢會是錯誤的嗎? –