IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

requêtes "conditionnelles"


Sujet :

SQL Procédural MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 3
    Points
    3
    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...

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Points : 120
    Points
    120
    Par défaut
    Sous Oracle il existe la fonction DECODE, peut être existe t elle sous MySQL ou un équivalent ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Sous MySQL DECODE est une fonction de décryptage...

  4. #4
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    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.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    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 )

  6. #6
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    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 ?

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    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 ?

    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...

  8. #8
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Citation Envoyé par _marabout
    Et une fois que le fichier est sur le serveur, quelle est la commande ?
    SOURCE nom_fichier

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    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 !

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO products VALUES (...),(...),(...),..."
    Apparemment cela peut être beaucoup plus rapide dixit la doc officielle...

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    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

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT IGNORE ... SELECT ...

Discussions similaires

  1. [MySQL] Insérer résultat d'une requête : problème de quote
    Par maxime17s dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/12/2008, 04h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo