【问题标题】:Preventing duplicates while selecting into variable in MySQL在 MySQL 中选择变量时防止重复
【发布时间】:2017-08-31 08:07:35
【问题描述】:

我的函数从Items 表生成唯一组合并存储到list 变量中。在生成结束时,它返回list 作为结果,应用程序处理每个组合:保存到Combo 表中。

问题

它每次都会检查来自另一个名为 Combo 的表中的重复项,该表将在流程的第二步(由应用程序,而不是函数本身)填充。

但是,在插入新生成的组合之前,它不会检查 listvariable 内的重复项。

所以我从函数中得到结果,结果本身有重复项。例如。 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

通过以下参数生成独特的(过去从未创建过)组合:

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

【问题讨论】:

  • 我不知道你想做什么。但是GROUP_CONCAT(DISTINCT ...) 会删除重复的 id。
  • @PaulSpiegel 我想要做的是,在插入新组合之前检查list 变量是否重复。如果有重复,则继续循环,直到我们得到permCount 的组合数。如果tries 时我们未能选择唯一的组合(不在listCombo 表内),那么我们退出。
  • 那么只删除重复项而不是再次执行查询会是错误的吗?
  • list; 分隔的组合字符串。所以你的建议是,从这个列表中删除每次重复?要不然是啥?我认为,在插入新组合之前进行逻辑检查是正确的。
  • DISTINCT 将在连接之前消除重复。

标签: mysql sql postgresql loops duplicates


【解决方案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;

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 2012-10-01
    • 2012-11-04
    • 2021-09-17
    • 2012-09-30
    • 2011-07-02
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多