2010-09-17 9 views
1

Je continue à obtenir cette erreur: Résultat composé de plus d'une ligneMySQL valeur de retour d'une instruction SELECT

J'ai cette fonction:

DROP FUNCTION IF EXISTS db.GetUserIDByCourseID; 
CREATE FUNCTION db.`GetUserIDByCourseID`(CourseID int) RETURNS int(11) 
BEGIN 
     SELECT (c.user_id + COALESCE(pi.user_id, 0) + COALESCE(p.user_id, 0)) 
     INTO @user_id 
     FROM courses c 
      LEFT JOIN users u 
       ON u.user_id = c.user_id 
      LEFT JOIN partners p 
       ON p.partner_id = c.partner_id 
      LEFT JOIN partners_individual pi 
       ON pi.individual_id = c.individual_id; 
      WHERE c.course_id = CourseID; 

     SELECT user_type_id 
     INTO @user_type_id 
     FROM users 
     WHERE user_id = @user_id; 

     RETURN @user_type_id; 
    END; 
+0

Si vous me permettez une observation, votre fonction 'GetUserIDByCourseID' doesn Ne pas retourner un 'user_id' mais un' user_type_id'. Je pense que cela peut conduire à la confusion pour les appelants. –

Répondre

2

Lorsque SELECT ing dans une variable, la Le jeu de résultats doit contenir exactement une ligne. Dans votre exemple actuel, il semble probable que la première instruction select retournera plus d'une ligne; vous pouvez vérifier cela en l'exécutant à la main pour les valeurs de CourseID qui causent des problèmes. Que faire à ce sujet je ne pourrais pas dire, car cela dépend des détails de votre conception.

+0

Merci, j'ai manqué cette clause sur le message original [WHERE c.course_id = CourseID;] –

0

Vous pouvez essayer SELECT TOP 1. L'une ou l'autre de vos instructions SELECT peut renvoyer plusieurs lignes. Je pense que vous devez vous asseoir et 1: comprendre votre modèle de données et 2: comprendre vos données.

Pour voir ce qui se passe plus clairement, exécutez ces requêtes par eux-mêmes et regarder les jeux de résultats:

SELECT (c.user_id + COALESCE(pi.user_id, 0) + COALESCE(p.user_id, 0)) 
    FROM courses c 
    LEFT JOIN users u 
     ON u.user_id = c.user_id 
LEFT JOIN partners p 
    ON p.partner_id = c.partner_id 
LEFT JOIN partners_individual pi 
    ON pi.individual_id = c.individual_id; 
    WHERE c.course_id = CourseID; 

SELECT user_type_id 
    FROM users 
    WHERE user_id = @user_id;