Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/11/2007, 10h58   #1
Invité de passage
 
Inscription : septembre 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 28
Points : 4
Points : 4
Par défaut MySQL 4.1 ou 5, creer une fonction

Bonjour, j'ai une big requete qui me renvoit un certain nombre de resultats (jusqu'ici pas de problemes ^^). Et je voudrais filtrer ces resultats selon une comparaison dynamique.
c'est à dire, ma requete qui fait des JOIN etc.. me renvoie des id d'utilisateurs.
à partir de là, j'aimerais passer en paramatre un id "type" d'un utilisateur, mais qui peut changer (d'où le besoin de faire une fonction) sur laquel j'effectue des comparaisons un à une selon des criteres.
Je pensais faire ca en php, mais avec les classes c'est trop long (je suis obligé, en php de :
1)creer ma classe user
2) pour chaque valeur de mon retour SQL, creer une classe user, et comparer à l'aide d'une fonction php s'il est ok ou pas par rapport au user du "1)"

bref ca marche mais j'ai la sensation que c'est lent. Soit c'est mon serveur qui est pourris, soit c'est effectivement tres lent.

la fonction que je souhaite faire est de ce genre
Code :
1
2
3
4
5
6
7
8
9
 
FUNCTION (lettre1, lettre2, lettre3, lettre4,<blockquote>lettrevisiteur1, lettrevisiteur2, lettrevisiteur3, lettrevisiteur4)</blockquote>{
 var resultat = 0;
IF (lettre1==lettrevisiteur1) resultat+=15;
IF (lettre2==lettrevisiteur1 || lettre2==lettrevisiteur2) resultat+=8;
etc... (mais que dans ce genre là, tres simple)
 
RETURN resultat;
}
et si le resultat est par exemple, plus grand que 15, bah on selectionne l'utilisateur.
Comme le SQL est extremement plus rapide que le php la dessus, et ca soulagera aussi la memoire du serveur. Et enfin pour ma culture personnelle
Si une gentille âme pouvait ne serait-ce que m'indiquer un point de depart, un lien m'aidant bien (je ne trouve pas grand chose, j'ai du mal à cibler ce que je cherche, au niveau des instructions meme).

Bref :S merci encore de votre aide!
Paul
polopollo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2007, 23h16   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 413
Points : 6 413
Bonjour,

Petite question, pour être sûr de bien comprendre : lettre1, lettre2, ..., lettrevisiteur1... ce sont des champs de ta base ou pas ?

Parce que dans ce cas, en utilisant les opérateurs IF ou CASE, tu n'as même pas forcément besoin d'une fonction.
Voilà 2 liens pour démarrer : fonctions de contrôle
procédures et fonctions

En espérant que ça t'aide...

ced
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2007, 11h26   #3
Invité de passage
 
Inscription : septembre 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 28
Points : 4
Points : 4
merci!

Donc en fait, j'ai exactement 2champs de 2 CHAR(4)
je dois prendre chaque lettre une par une et les comparer, selon ces resultats en tirer un chiffre que j'analyse.

pour donner plus d'infos precises : j'ai un utilisateur modele (qui peut varier)
Il y a un champs CHAR(4).
Maintenant j'ai une base avec une tonne d'autre utilisateurs. Je dois, pour savoir si on peut les selectionner, utiliser la fonction suivante que j'ai essayé de créer :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
CREATE FUNCTION comaparaison (mot1, mot2) RETURNS INT
BEGIN
	DECLARE lettre1, lettre2, lettre3, lettre4, lettrevisiteur1, lettrevisiteur2, lettrevisiteur3, lettrevisiteur4 CHAR(1);
	DECLARE resultat INT;
 
	SET resultat = 0;
	SET lettre1 = SUBSTRING(mot1, 1, 1);
	SET lettre2 = SUBSTRING(mot1, 2, 1);
	SET lettre3 = SUBSTRING(mot1, 3, 1);
	SET lettre4 = SUBSTRING(mot1, 4, 1);
	SET lettrelettrevisiteur1 = SUBSTRING(mot2, 1, 1);
	SET lettrelettrevisiteur2 = SUBSTRING(mot2, 2, 1);
	SET lettrelettrevisiteur3 = SUBSTRING(mot2, 3, 1);
	SET lettrelettrevisiteur4 = SUBSTRING(mot2, 4, 1);
 
	SELECT CASE (lettre1==lettrevisiteur1) 
			WHEN true THEN (SET resultat = resultat + 16) END;
 
	SELECT CASE (lettre1==lettrevisiteur2) 
			WHEN true THEN (SET resultat = resultat + 8) END;
 
//etc etc... mais tous comme les 2requetes au dessus
 
	RETURN resultat;
END;
et à la fin pour savoir si l'utilisateur est eligible ou pas je fais un :
Code :
1
2
 
CASE WHEN (comparaison(champuserXXX, champuserType) > 24) THEN userXXX
mais là je suis pas sur de bien faire
Pour moi le sql se resumait à des select, udate, delete dans du php.
Là faut que je vois comment "enregsitrer" la fonction dans la base, ou la passer à sql en meme temps que la requete (mais je suppose que tout mettre dans mysql_query séparé par des ";" devrait suffire.

Je teste tout ca pour commencer merci encore de tes liens et du temps que tu m'as consacré!
polopollo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2007, 12h02   #4
Invité de passage
 
Inscription : septembre 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 28
Points : 4
Points : 4
apres avoir tenté je bloque un peu sur la validation de ma syntaxe :
la fonction que j'essaye deja d'executer dans mon phpmyadmin me donne une erreur sur le DECLARE on dirait.
Pourtant j'ai bien une version 5 :'(
polopollo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 13h16   #5
Candidat au titre de Membre du Club
 
Inscription : août 2006
Messages : 46
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 46
Points : 13
Points : 13
Bonjour à tous. Moi j'utilise fréquemment cette requete
Code :
UPDATE matable SET monchamp=REPLACE(monchamp , exp1, exp)
je souhaite écrire une fonction du genre
Code :
1
2
3
4
5
6
 
CREATE FUNCTION Remplacer(_table,_champ,_lettre1,_lettre2) RETURNS INT
   BEGIN
   UPDATE _table SET _champ =REPLACE( _champ , _lettre1, _lettre2);
   RETURN 1;
END
Mais en fait je vois pas bien comment faire. donnez moi un coup de main SVP
Lynecoln est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h20.


 
 
 
 
Partenaires

Hébergement Web