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

PHP & Base de données Discussion :

Extraction d'e-mails uniques dans +50000 enregistrements


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de bractar
    Inscrit en
    Janvier 2004
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 224
    Par défaut Extraction d'e-mails uniques dans +50000 enregistrements
    Bonjour,
    j'extrais les infos client de ma base de données Mysql stockant des données Magento (magasin en ligne).

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    "SELECT DISTINCT e.value as email, ln.value as lastname, fn.value as firstname, ct.value as country
    FROM sales_order o
    INNER JOIN sales_order_varchar e ON e.entity_id = o.entity_id AND attribute_id = ".$atEmail."
    INNER JOIN sales_order_entity lne ON lne.parent_id = o.entity_id AND lne.entity_type_id = ".$etID."
    INNER JOIN sales_order_entity_varchar ln ON ln.entity_id = lne.entity_id AND ln.attribute_id = ".$atLn."
    INNER JOIN sales_order_entity_varchar fn ON fn.entity_id = lne.entity_id AND fn.attribute_id = ".$atFn."
    INNER JOIN sales_order_entity_varchar ct ON ct.entity_id = lne.entity_id AND ct.attribute_id = ".$atCt."
    WHERE o.created_at AND ct.value = 'US' AND e.value != '' AND o.store_id != 15 AND o.store_id != 8
    ORDER BY cs.name, ln.value";
    Le probleme est que je voudrais obtenir des e-mails sans doublon. Ce qui est essez difficile. Certaines personnes corrigeant/changeant de nom/prenom entre 2 commandes. (Jon Smith en John Smith par example)

    Bref, avec cette requête, j'obtiens une liste de 66000 enregistrements. Je ne sais pas si il est possible d'éviter ce genre de doublon avec sql.
    En php, je voulais les trier dans une boucle afin de de pas avoir de doublons. Mais ca prends trop de temps/de ressources serveur.

    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
    $emailCheck = array();
    do{	
    		$foundEmail = false;
    		for($i = 0; $i < count($emailCheck); $i++)
    		{
    			if($emailCheck[$i] == $row_rsA["email"])
    				$foundEmail = true;
    		}
     
    		if(!$foundEmail)
    		{
    			echo $row_rsA["lastname"].",".$row_rsA["firstname"].",".$row_rsA["email"]."\n";
    			array_push($emailCheck, $row_rsA["email"]);
    		}
    }while($row_rsA = mysql_fetch_assoc($rsA));
    Avez-vous une meilleure méthode afin de trier les emails?
    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 99
    Par défaut
    Bonjour,

    As-tu essayé dans ta requête de grouper par email ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    "SELECT DISTINCT e.value as email, ln.value as lastname, fn.value as firstname, ct.value as country
    FROM sales_order o
    INNER JOIN sales_order_varchar e ON e.entity_id = o.entity_id AND attribute_id = ".$atEmail."
    INNER JOIN sales_order_entity lne ON lne.parent_id = o.entity_id AND lne.entity_type_id = ".$etID."
    INNER JOIN sales_order_entity_varchar ln ON ln.entity_id = lne.entity_id AND ln.attribute_id = ".$atLn."
    INNER JOIN sales_order_entity_varchar fn ON fn.entity_id = lne.entity_id AND fn.attribute_id = ".$atFn."
    INNER JOIN sales_order_entity_varchar ct ON ct.entity_id = lne.entity_id AND ct.attribute_id = ".$atCt."
    WHERE o.created_at AND ct.value = 'US' AND e.value != '' AND o.store_id != 15 AND o.store_id != 8
    GROUP BY e.value
    ORDER BY cs.name, ln.value";

  3. #3
    Membre confirmé Avatar de bractar
    Inscrit en
    Janvier 2004
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 224
    Par défaut
    Merci, ca a fonctionne!

    Cependant je reste ouvert a une solution php qui ne consommerait pas trop de ressources afin de trier un grand nombre d'enregistrement. Je pourrais en avoir besoin bientot.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Ça semble fonctionner mais les valeurs retournées par les colonnes du SELECT ne faisant pas partie du regroupement (GROUP BY) donneront des résultats aléatoires.

    Autrement dit, pour un email, tu auras un nom, un prénom et un pays pris au hasard dans la liste des possibilités pour cet email. Pas forcément le dernier valide.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre confirmé Avatar de bractar
    Inscrit en
    Janvier 2004
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 224
    Par défaut
    oui, j'avais remarqué ca.
    Comme je le disais dans mon 1er exemple je peux avoir ce genre de chose avec la 1ere requête

    monemail@developpez.net Jon Smith
    monemail@developpez.net John Smith

    la 2nde requête avec le GROUP BY e.value
    me renvoit

    monemail@developpez.net Jon Smith alors que je préfèrerais avoir
    monemail@developpez.net John Smith

    A part un tri avec php, je ne vois pas trop comment faire afin de garder le dernier enregistrement pour un email identique. Or, de ce coté j'ai des problèmes de ressource du au nombre d'enregistrements retournés. (66000)

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par bractar Voir le message
    A part un tri avec php, je ne vois pas trop comment faire afin de garder le dernier enregistrement pour un email identique.
    Qu'est-ce qui caractérise le "dernier" enregistrement ? Une colonne de date ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/06/2012, 10h28
  2. Postfix: enregistrer tous les mails reçus dans des fichiers
    Par piemur2000 dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 28/11/2011, 16h17
  3. Réponses: 5
    Dernier message: 02/05/2011, 13h22
  4. Mail de validation et enregistrement dans bdd
    Par skandaboy dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/03/2011, 23h54
  5. Réponses: 3
    Dernier message: 14/09/2009, 13h41

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