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

Requêtes MySQL Discussion :

optimisation requetes mysql


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Par défaut optimisation requetes mysql
    Bonjour,

    Je travaille avec php et j'essaie de réduire le nombre de requetes sql de mon site web.
    Est-il possible de faire un INSERT INTO avec une condition ???
    Donc ne faire l'insert que si une valeur de cette même table n'est pas trouvé (si pas de doublons sur la clé unique)
    Donc je voudrais réduite le code suivant et l'optimiser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $query = "SELECT * FROM ptpip WHERE ip='$ip'";
    $result = mysql_query($query, $connection) or die('error making query');
    $affected_rows = mysql_num_rows($result);
    if ($affected_rows==0) {
    	$query5="INSERT INTO ptpip VALUES ('$ip',CURDATE())";
    	$result5 = mysql_query($query5, $connection) or die('error making query');
    	$iptrouve=0;
    }
    else {
     	$query5="update ptpip set date=CURDATE() where ip='$ip' and date!=CURDATE()";
    	$result5 = mysql_query($query5, $connection) or die('error making query');
    	$affected_rows5=mysql_affected_rows();
    	if ($affected_rows5!=0) {
    	$iptrouve=0;
    	}
    }
    N'y a t il pas moyen de faire une seule requete avec le select et l'insert voire même l'update tout dans la même requete.
    Celà ferait moins d'accès à la base de données.
    De plus avec ce code j'ai mis l'IP en clé unique et il s'avère que lors du passage de l'IP en clé unique mysql m'a indiqué que j'avais des doublons sur l'ip ce qui est théoriquement impossible avec le code ci-dessus puisque le select s'assure justement que l'insert ne soit pas fait si select ne retourne rien.

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut,

    ceci peut-il t'aider dans ce que tu veux faire : http://dev.mysql.com/doc/refman/5.0/fr/replace.html ?

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Bonjour,

    Malheureusement, ce que tu demandes n'existe en SQL que depuis la version 2003 de la norme, et c'est le mot clef MERGE.
    Cette commande n'est pas encore implémentée dans MySQL (à ma connaissance en tout cas), mais elle fera ce que tu décrits : mise à jour d'une ligne si elle existe, ou ajout si elle n'existe pas.
    Il va falloir attendre encore un peu

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    REPLACE semble exister depuis toujours en MySQL, où il est effectivement considéré comme "une extension de la norme". C'est l'équivalent d'un DELETE suivi d'un INSERT, autrement dit, on perd toutes les infos non ré-insérées.

    Une alternative qui évite ce problème est le INSERT... ON DUPLICATE KEY UPDATE, disponible depuis la 4.1.

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Par défaut
    Oui je connais tout çà mais le problème ici c'est que je dois savoir si l'ip a été trouvé ou non donc j'ai besoin d'un select et tester mysql_num_rows.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Avec REPLACE, il y a une astuce : si c'est une insertion simple, mysql_affected_rows() renvoie 1 ; si c'est un vrai remplacement, donc une suppression suivie d'une insertion, mysql_affected_rows() renvoie 2.

    Ça ne marche évidemment pas avec INSERT... ON DUPLICATE KEY UPDATE, puisque dans tous les cas, une seule ligne est affectée.

    Enfin, tu peux également avoir un raisonnement inverse :
    1. nettoyer les doublons sur les IP pour pouvoir faire une clé primaire - si tu crois toujours qu'il n'y en a pas, passe la requête suivante pour te convaincre :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      SELECT ip, COUNT(*)
      FROM ptpip
      GROUP BY ip
      HAVING COUNT(*) > 1 ;
    2. créer la clé primaire
    3. faire l'insert sans te poser la question de savoir si l'IP existe déjà ou pas.
    4. si table refuse pour cause de doublon (mysql_errno()), tu fais un UPDATE.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] optimisation requete mysql - while imbriquée
    Par Sbeuh dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 19/08/2010, 00h43
  2. Aide pour optimiser requete MYSQL
    Par roadruner dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/03/2009, 11h24
  3. Optimisation requete (MySQL 4.1 ou sup)
    Par Jean Fi dans le forum Requêtes
    Réponses: 4
    Dernier message: 01/04/2008, 09h29
  4. [MySql] Optimisation Requete Balance Client
    Par rockclimber dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/11/2006, 14h55
  5. AIdez moi à optimiser cette requete MySQL SVP
    Par petozak dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/09/2005, 15h16

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