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 30/03/2006, 12h21   #1
Invité de passage
 
Inscription : mars 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 9
Points : 1
Points : 1
Par défaut requêtes "conditionnelles"

Est-il possible (en mysql 4.1) de faire des requêtes conditionnelles pour éviter de faire des traitements conditionnels en php et plusieurs requêtes ?

Ce que je veux faire c'est quelque chose comme ça mais en un seul appel de mysql_query :
- Si la table catégories contient un enregistrement avec le nom "canapés", renvoyer l'identifiant
- Sinon :
o insérer la catégorie "canapés",
Ensuite :
Insérer le modèle "toronto" dans la table produit en enregistrant l'identifiant de la catégorie insérée ou déjà existante dans un champ catID

Cela est facile à faire avec du PHP, mais comme je vais appliquer ce traitement (et d'autres) sur une grosse table (données importées avec LOAD DATA INFILE) je me disais qu'il vaut mieux optimiser et se passer du maximum d'allers-retours php-mysql, si c'est possible...
_marabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 13h52   #2
Membre régulier
 
Inscription : juillet 2004
Messages : 393
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 393
Points : 80
Points : 80
Sous Oracle il existe la fonction DECODE, peut être existe t elle sous MySQL ou un équivalent ?
shadeoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 14h07   #3
Invité de passage
 
Inscription : mars 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 9
Points : 1
Points : 1
Sous MySQL DECODE est une fonction de décryptage...
_marabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 14h26   #4
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Sous MySQL ce genre de choses n'est pas possible en une seule requête.

Si tu souhaites préserver l'atomicité d'un bloc de commandes SQL, tu peux utiliser une transaction (InnoDB).

Les procédures stockées de MySQL 5 permettent aussi d'exécuter une série de requêtes sans aller-retour entre le serveur et le client à chaque fois.
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 14h39   #5
Invité de passage
 
Inscription : mars 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 9
Points : 1
Points : 1
Citation:
Envoyé par Maximilian
Sous MySQL ce genre de choses n'est pas possible en une seule requête.

Si tu souhaites préserver l'atomicité d'un bloc de commandes SQL, tu peux utiliser une transaction (InnoDB).

Les procédures stockées de MySQL 5 permettent aussi d'exécuter une série de requêtes sans aller-retour entre le serveur et le client à chaque fois.
Ouais donc adieu tout ça : je suis en MySQL 4.1 et tables MyISAM...

Je pensais à une autre possibilité : y a-t-il un moyen pour exécuter plusieurs commandes depuis un fichier ? Ca ne règlerait pas mon problème, mais cela permettrait au moins de limiter les échanges php-mySQL en groupant les requêtes à chaque fois que possible dans un fichier que je ferais ensuite exécuter d'un seul coup par MySQL... J'ai cherché sur la doc officielle mais je n'ai rien trouvé de tel, mais j'ai peut-être mal cherché ? (Dis oui dis oui dis oui )
_marabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 14h55   #6
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Oui mais il faut uploader le fichier sur le serveur d'une manière ou d'une autre. Ce n'est pas forcément élégant ni plus performant que faire plusieurs requêtes à la suite.
Ton réseau est si instable que ça ?
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 15h12   #7
Invité de passage
 
Inscription : mars 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 9
Points : 1
Points : 1
Citation:
Envoyé par Maximilian
Oui mais il faut uploader le fichier sur le serveur d'une manière ou d'une autre. Ce n'est pas forcément élégant ni plus performant que faire plusieurs requêtes à la suite.
Et une fois que le fichier est sur le serveur, quelle est la commande ?

Citation:
Ton réseau est si instable que ça ?
Non, j'ai du mal à évaluer la charge que mon traitement va représenter, donc par précaution je me dis autant limiter les échanges. En gros j'ai une table qui résulte de l'import d'un fichier xls et je dois remplir la base en parcourant cette table, ce qui va générer au moins une dizaine de requêtes par ligne de la table...
_marabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 16h48   #8
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Citation:
Envoyé par _marabout
Et une fois que le fichier est sur le serveur, quelle est la commande ?
SOURCE nom_fichier
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 17h19   #9
Invité de passage
 
Inscription : mars 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 9
Points : 1
Points : 1
Citation:
Envoyé par Maximilian
SOURCE nom_fichier
Apparemment ça n'existe qu'en ligne de commande avec le client mysql... donc je ne peux pas l'utiliser dans mon script php. Tant pis, ce sera moins optimisé, mais je vais moins me prendre la tête du coup

Merci pour ton aide !
_marabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 17h34   #10
Invité de passage
 
Inscription : mars 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 9
Points : 1
Points : 1
En fait vu que le gros des requêtes va être des INSERT, je peux déja hyper optimiser en utilisant les valeurs multiples.

J'ai 5 tables à alimenter en parcourant cette table d'import. Si pour chaque ligne je fais un insert, ça va faire (5 x le nombre de lignes) INSERT...

Par contre si je concatène les valeurs dans une seule chaine INSERT ça fera toujours que 5 requêtes INSERT au final :
Code :
"INSERT INTO products VALUES (...),(...),(...),..."
Apparemment cela peut être beaucoup plus rapide dixit la doc officielle...
_marabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 18h17   #11
Invité de passage
 
Inscription : mars 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 9
Points : 1
Points : 1
arrrrhhhhhhh !

Bon c'est pas aussi simple évidemment, parce que les différents insert sont reliés entre eux : l'insertion dans plusieurs tables dépend de l'insert_id d'insertions dans d'autres tables ... si j'insère toutes les tables d'un coup, bye bye le insert id...

Bon tant pis, pas d'optimisation dans ce genre et on verra au final... si le client a le temps de s'endormir on fera une jolie animation d'attente
_marabout est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2006, 14h46   #12
Membre expérimenté
 
Étudiant
Inscription : mars 2006
Messages : 396
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2006
Messages : 396
Points : 500
Points : 500
Citation:
Envoyé par _marabout
J'ai 5 tables à alimenter en parcourant cette table d'import. Si pour chaque ligne je fais un insert, ça va faire (5 x le nombre de lignes) INSERT...
As-pu penser à INSERT SELECT pour insérer dans une table des données provenant d'une autre table ?
Tu peut en plus utiliser le mot clé IGNORE pour éviter les doublons.

Ce qui donnerait
Code :
INSERT IGNORE ... SELECT ...
jeremya 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 23h01.


 
 
 
 
Partenaires

Hébergement Web