mysql - 如何在存储过程MySQL中使用GROUP_CONCAT

标签 mysql stored-procedures nested-loops group-concat

我正在尝试在存储过程中的另一个查询中使用逗号分隔值 (@job_skills),如下所示。但它没有按预期工作。艾米,它只考虑逗号分隔字符串中的第一个值。有没有其他方法可以修补?

SELECT GROUP_CONCAT(skillId) as job_skills FROM tbljob_skill as jskl WHERE jskl.jobpostingId = param_jobid INTO @job_skills;

    BLOCK6: BEGIN
        DECLARE curl_job12 CURSOR FOR SELECT * FROM (SELECT js.jobseekerId FROM tbljobseeker_skill as jss INNER JOIN tbmstjobseeker as js ON (js.jobseekerId = jss.jobseekerId) INNER JOIN tblrecommended_jobseekers_details as rjd ON (js.jobseekerId=rjd.jobseekerId) WHERE jss.skillId IN (@job_skills) AND js.isActive = 'Y' AND js.lat<>0 AND js.lang<>0 AND rjd.sessionid=param_sessionid GROUP BY js.jobseekerId) as m;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET job_done12 = TRUE;
        OPEN curl_job12;
            read_loop_job12: LOOP
                FETCH curl_job12 INTO jsid, miles;
                IF job_done12 THEN
                    LEAVE read_loop_job12;
                END IF;
                INSERT INTO temp_skills (jobId,skill,jobseekerId) VALUES (param_sessionid,@job_skills,jsid);
                IF jsid <> '' THEN
                    SELECT COUNT(1) INTO check_exists FROM tblrecommended_jobseekers_details WHERE sessionid = param_sessionid AND type = 'match 1 - SKILLS' AND jobseekerId = jsid;
                    IF check_exists = 0 THEN
                        START TRANSACTION;
                        INSERT INTO temp_jobseekers_scores (jobseekerId,score,type,miles) VALUES (jsid,score_skills,'match 1',miles);
                        INSERT INTO tblrecommended_jobseekers_details (jobseekerId,score,type,miles,sessionid) VALUES (jsid,score_skills,'match 1 - SKILLS',miles,param_sessionid);
                        COMMIT;
                    END IF;
                END IF;
            END LOOP;
        CLOSE curl_job12;
    END BLOCK6;

最佳答案

生成的逗号分隔值是一个 SET 并且在与 IN 函数一起使用时被视为一个单个 字符串。相反,您必须使用 FIND_IN_SET 来与其他值进行比较。

如下更改 CURSOR 定义中的 WHERE 子句。

DECLARE curl_job12 CURSOR FOR 
        SELECT * FROM (
            SELECT js.jobseekerId 
              FROM tbljobseeker_skill as jss 
             INNER JOIN tbmstjobseeker as js 
                     ON (js.jobseekerId = jss.jobseekerId) 
             INNER JOIN tblrecommended_jobseekers_details as rjd 
                     ON (js.jobseekerId=rjd.jobseekerId) 
             --  WHERE jss.skillId IN (@job_skills) 
             WHERE FIND_IN_SET( jss.skillId, @job_skills ) 
               AND js.isActive = 'Y' 
               AND js.lat<>0 
               AND js.lang<>0 
               AND rjd.sessionid=param_sessionid 
             GROUP BY js.jobseekerId
        ) as m;

引用文档:

关于mysql - 如何在存储过程MySQL中使用GROUP_CONCAT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31404177/

相关文章:

r - 如何从 R 中的包中提取信息并在函数中使用?

mysql - 在 MySQL 中创建渐进求和列

php - 如何将yii中的输入保存到数据库

mysql - 如何创建可从任何地方编辑的存储例程

c# - 存储过程默认值

python - 更快/更智能的循环 [Python]

PHP - 奇怪的循环结果

mysql - 规范化现有多列、多字符串表的最佳方法?

c# - 如何在 C# 中调用带有对象参数的 Oracle 存储过程作为输入?

r - 在列表列表上嵌套应用语句