2013-04-08 144 views
2

我有一个问题,通过用户给定的参数来排序我的存储过程,我试过阅读,但我尝试过的解决方案将无法工作。通过存储过程订购参数

那么,有没有人可以帮助我?我希望它通过我的Group_concat中的Type进行排序。它可以工作,如果我输入harcoded,如(ORDER BY Type1,ORDER BY Type2等)。但我想这样(ORDER BY @specificStat)。

CREATE PROCEDURE getSpecificStatsBySeason(IN khID INT(11), IN seasonName varchar(40), IN specificStat INT(11)) 
BEGIN 

SET @sql = NULL; 
SET @khID = khID; 
SET @seasonName = seasonName; 
SET @specificStat = specificStat; 

SELECT 
    GROUP_CONCAT(DISTINCT CONCAT('SUM(IF(em.eventTypeID = ', 
     et.eventTypeID, ', 1, 0)) AS Type', 
     et.eventTypeID) 
) INTO @sql 
FROM eventTypes  AS et, `eventType-R-kh` AS eRk, kh AS kh WHERE et.eventTypeID = eRk.eventTypeID AND eRk.kh = kh.kh AND kh.khID = @khID; 

SET @sql = CONCAT('SELECT u.userID, ud.firstname, ud.lastname,', @sql, 
        ', 
        IFNULL((SELECT COUNT(s.activityID) 
          FROM activity AS a1, signup AS s 
          WHERE u.userid = s.userid 
          AND s.activityID = a1.activityID 
          AND a1.khID = @khID 
          AND s.answer = 1 
          AND se.seasonName = @seasonName 
      AND a1.activityDate BETWEEN se.seasonStart AND se.seasonEnd 
        AND a1.activityDate <= NOW()), 0) AS matchCount 
        FROM userData AS ud, userInfo AS u 
        LEFT JOIN activity  AS a ON a.khID = @khID 
        RIGHT JOIN season AS se ON se.seasonName = @seasonName 
      AND a.activityDate BETWEEN se.seasonStart AND se.seasonEnd 
        LEFT JOIN `eventMatch`  AS em ON em.userid = u.userid 
        AND em.activityID = a.activityID 
        LEFT JOIN activityMatch AS am ON a.activityID = am.activityID 
        WHERE u.khID = @khID 
        AND u.userID = ud.userID 
        GROUP BY u.UserID 
        ORDER BY @specificStat ;'); 


prepare stmt 
FROM @sql; 

execute stmt; 

回答

2

使用这个代替:

... 
... 
    AND u.userID = ud.userID 
       GROUP BY u.UserID 
       ORDER BY ', @specificStat, ' ;'); 
+0

是,作品辉煌:-) – 2013-04-08 18:01:26

+0

@ user2046146 AGAIN - 欢迎你任何时候:) – 2013-04-08 19:02:05