Domanda

It returns IDs as string, it returns only one row which it has first ID. "7,6,5" It returns only 7; How can we correct this problem?

CREATE DEFINER=`root`@`localhost` 
PROCEDURE `GET_COMPANION`(IN paramEmployeeId INT)
BEGIN
    DECLARE counter INTEGER DEFAULT 0;
    DECLARE v_finished INTEGER DEFAULT 0;
    DECLARE v_companion varchar(100) DEFAULT "";
    DECLARE v_companion_list varchar(100) DEFAULT "";

    -- declare cursor for companion_id
    DEClARE companion_cursor CURSOR FOR
        SELECT companion_id FROM employee_has_companion ehc 
        WHERE ehc.employee_id = paramEmployeeId;

    -- declare NOT FOUND handler
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;

    OPEN companion_cursor;

    get_companion: LOOP
        FETCH companion_cursor INTO v_companion;

        IF v_finished = 1 THEN
            LEAVE get_companion;
        END IF;

        -- build companion list
        SET v_companion_list = CONCAT(v_companion,",",v_companion_list);
    END LOOP get_companion;

    CLOSE companion_cursor;

    SELECT * FROM companion co 
    LEFT JOIN citizenship ci 
      ON co.citizenship_id = ci.citizenship_id
    WHERE co.companion_id IN( SUBSTRING(v_companion_list,
                                        1,LENGTH(v_companion_list)-1));
END
È stato utile?

Soluzione

You can use FIND_IN_SET(str,strlist) to check existence of a string in a list of comma separated values.

Change:

SELECT * FROM companion co 
    LEFT JOIN citizenship ci 
      ON co.citizenship_id = ci.citizenship_id
    WHERE co.companion_id IN( SUBSTRING(v_companion_list,
                                        1,LENGTH(v_companion_list)-1));

To:

SELECT * FROM companion co 
    LEFT JOIN citizenship ci 
      ON co.citizenship_id = ci.citizenship_id
    WHERE FIND_IN_SET( co.companion_id, v_companion_list ) > 0;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top