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 :

[MySQL] Grosse requête


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Points : 25
    Points
    25
    Par défaut [MySQL] Grosse requête
    Bonjour,

    J'ai une table (table1) de 800.000 lignes avec plusieurs champs.
    J'aimerais pouvoir ne récupérer qu'un seul champ, et copier toutes ces lignes sur une autre table (table2).

    Ma méthode, qui sature totalement le serveur et fait planter mon script, est de lister mes lignes via un mysql_fetch_assoc(), d'extraire le champ, et de réinjecter le tout sur la table2 dans une boucle :

    // Part 1
    $sql = "SELECT id FROM table1 WHERE liste IN (1, 2, 3, 4)";
    $sql = mysql_query($sql);
    $rows = mysql_fetch_assoc($sql);

    // Part 2
    foreach ($rows as $cle => $valeur)
    {
    $sql = "INSERT INTO `table2` VALUES(NULL, '". $valeur['id'] ."', 'XXX')";
    mysql_query($sql);
    }
    Auriez-vous une solution plus adaptée pour ce genre de requête ?

    Merci.

    PS : à savoir que la première requête de 800.000 ligne fait planter le script..

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Il faut faire une seule requête de ce genre ( extraite de la doc MySQL) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO tbl_temp2 (fld_id)
      SELECT tbl_temp1.fld_order_id
      FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Bonjour Fred,

    Merci pour cette réponse. La requête fonctionne.
    Cependant, dans la ligne "INSERT INTO tbl_temp2 (fld_id)", j'arrive bien a ajouter les variables stockées de mon autre table (id et liste), mais impossible d'ajouter une variable sur un champs particulier

    Ex : comment ajouter une variable pour le champ "info" dans la table1 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO table1 (id, liste) 
    SELECT table2.id, table2.liste
    FROM table2 
    WHERE table2.liste IN (1, 2, 3, 4)
    Car si je fais une requête du type, ça ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO table1 (id, liste, info) VALUES(id, liste, 'xxx')
    SELECT table2.id, table2.liste
    FROM table2 
    WHERE table2.liste IN (1, 2, 3, 4)
    Merci.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO table1 (id, liste, info) 
    SELECT table2.id, table2.liste, 'xxx'
    FROM table2 
    WHERE table2.liste IN (1, 2, 3, 4)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Parfait

    Maintenant, la requête passe toute seule, et est très rapide !
    Merci beaucoup de ton aide.

    Florent

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Par contre, sur un autre serveur, ça ne passe pas.
    Pour une meilleurs optimisation de la recherche, j'ai mis les champs "id" et "liste" en INDEX.

    Est-ce bon où faut-il mettre un PRIMARY KEY sur le champ "id" ?

    Merci

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

Discussions similaires

  1. MySQL indisponible lors d'une grosse requête
    Par Guireg dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/07/2009, 11h51
  2. [MySQL] Une requête n'aboutissant pas
    Par Livingstone dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/02/2006, 11h36
  3. Réponses: 8
    Dernier message: 14/01/2005, 10h06
  4. [MFC] [API mySQL] Sous requêtes
    Par Guybrush113 dans le forum MFC
    Réponses: 5
    Dernier message: 29/04/2004, 17h14
  5. Réponses: 14
    Dernier message: 17/03/2003, 19h31

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