通过存储过程的行号

Row number through stored procedure

我通过 sqlyog 中的 SQL 语句获取行号,如下所示;

SET @v_num:=0;
SET @v_type := 0;

SELECT  pd.event_id,
        @v_num := IF(@v_type = pd.event_id, @v_num + 1, 1) AS row_number,
        @v_type := pd.event_id AS dummy
        ,CONCAT(va.id,',',va.`firstname`,',',va.`lastname`,',',IFNULL(va.`picture`,'')) user_info
FROM p_details pd
INNER JOIN vw_all va ON pd.pass_for = va.`user_type` AND pd.attendee_id = va.`id` AND va.`pass_id` = pd.id
WHERE CURRENT_DATE() BETWEEN pd.start_date AND pd.end_date
AND pd.event_id IN (9,50) 
ORDER BY pd.event_id,pd.last_date_time DESC

如您所知,我们不能使用@v 和“@v_num := IF(@v_type = pd.event_id, @v_num + 1, 1)”在存储过程中。所以我无法通过 mysql 存储过程获取行号。

有什么想法吗?

为什么您认为不能在存储过程中使用此技术? 只需将 CREATE PROCEDURE 语句包裹在您的代码中,如下所示:

CREATE PROCEDURE testRowNum ()
BEGIN
SET @v_num:=0;
SET @v_type := 0;

SELECT  pd.event_id,
        @v_num := IF(@v_type = pd.event_id, @v_num + 1, 1) AS row_number,
        @v_type := pd.event_id AS dummy
        ,CONCAT(va.id,',',va.`firstname`,',',va.`lastname`,',',IFNULL(va.`picture`,'')) user_info
FROM p_details pd
WHERE Something = 'SomeValue';
END;

你可以开始了。

通过此命令修复的重复值:

SELECT  tt.event_id,
        @num := IF(@type = tt.event_id, @num + 1, 1) AS row_number,
        @type := tt.event_id AS dummy,
        tt.info user_info
FROM (
    SELECT  pd.event_id
            ,CONCAT(va.id,',',va.`firstname`,',',va.`lastname`,',',IFNULL(va.`picture`,'')) info
    FROM p_details pd
    INNER JOIN vw_all va ON pd.pass_for = va.`user_type` AND pd.attendee_id = va.`id` AND va.`pass_id` = pd.id
    WHERE CURRENT_DATE() BETWEEN pd.start_date AND pd.end_date
    AND   pd.last_date_time IS NOT NULL
    ORDER BY pd.event_id,pd.last_date_time DESC
    )tt