Doublon dans des table mysql - PHP - Programmation
Marsh Posté le 10-12-2003 à 18:00:31
j'ai absolument rien compris a par doublon
enfin bon sinon pour els doublon tu peu toujours faire un while ou faire un count ou l'email est $mail
un truc du genre quoi
Marsh Posté le 10-12-2003 à 18:02:08
chacal_one333 a écrit : j'ai absolument rien compris a par doublon |
on peut pas le faire avec mysql y pas une commande pour ca ?
Marsh Posté le 10-12-2003 à 18:02:13
vous faites une concours de la plus longue phrase sans ponctuation?
Marsh Posté le 10-12-2003 à 18:03:53
gizmo a écrit : vous faites une concours de la plus longue phrase sans ponctuation? |
Désolé je ne suis pas tres doué pour ces choses là et pour le reste d'ailleur
Marsh Posté le 10-12-2003 à 20:24:19
Ca me parait effectivement difficile de faire tout ca avec des requêtes. Je pense qu'un script s'impose
Marsh Posté le 11-12-2003 à 01:51:25
As tu acces en ssh à ta base de donnée ?
Si oui, c'est pas un script qu'il te faut, car, suivant le nombre d'enregistrements que tu as
dans tes tables, cela pourra te prendre une seconde a des heures (je sais de quoi je te parle,
tres souvent je suis amener a preparer des bases d'envoi de 500 000 lignes )
je voudais dans un premier temp supprimer les emails qui son dans la table t_nepasenvoyer :
Ben pour ca, c facile, tu fais une requete "DELETE"
verifier si dans la table t_email il n'y a pas de doublon avec la table t_temp si oui effacer un exemplaire de chaque doublon dans t_temp :
Facile
Il faut par contre absolument que tes tables soient unique sur l'email.
Procédure :
Repérer un champ toujours vide dans ta table t_email, si il y en a pas, en créer un (ALTER TABLE t_email etc...)
Initialiser ce champ à "OK" par exemple pour toutes les lignes de la table t_temp :
UPDATE t_temp SET champ = "OK";
Récupérer les enregistrements de ta table t_email avec le champ à "OK" :
SELECT email, champsAOK FROM t_email INTO OUTFILE 'tonFichier1';
Repérer un champ toujours vide dans ta table t_temp, si il y en a pas, en créer un (ALTER TABLE t_temp etc...)
Charger "tonFichier1" dans ta table t_temp :
LOAD DATA INFILE 'tonFichier1' REPLACE INTO TABLE t_temp (email, champ);
Supprimer de cette table tous les email dont le champs "champ" (ou celui que tu avais choisis) est à "OK" :
DELETE FROM t_email WHERE champ = "OK";
Reste plus qu'a updater la table t_email avec la table t_temp :
SELECT email FROM t_temp INTO OUTFILE 'tonFichier2';
LOAD DATA INFILE 'tonFichier2' INTO TABLE t_email (email);
A priori, ca devrait le faire, et ca prend pas plus de 15 minutes (remarque cela depend de la taille de tes tables )
Sinon, tu peux faire un script php en t'inspirant de ce k'il y a au dessus... A toi de voir
Marsh Posté le 11-12-2003 à 02:01:01
blackPhantom a écrit : tres souvent je suis amener a preparer des bases d'envoi de 500 000 lignes |
Un enculé de spameur !
c'est toi Corey Griggs alias "Women say yes to SIZE" ?
Marsh Posté le 11-12-2003 à 06:53:22
Attendez, une jointure et c'est fini son truc ...
Delete from TTemp where email IN ( Select email from t_nepasenvoyer );
Delete from TTemp where email IN ( select email from t_email);
Insert into temail blablaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
Pour le probleme des sous requete, lire la doc Mysql et autres exemples sur le net pour contourner ce genre de sucis.
Marsh Posté le 11-12-2003 à 11:29:59
nraynaud a écrit : Un enculé de spameur ! |
t'es qui pour me traiter de spammeur? Ces envois sont fait sur nos membres qui ont acceptés de recevoir notre newsletter ou sur les bases de nos clients (lastminute, travelprice etc...) et je te conseille de réediter ton message, car e-c-l- ca passe pas trop chez les modos...
Marsh Posté le 11-12-2003 à 11:35:46
tetedeiench a écrit : Attendez, une jointure et c'est fini son truc ... |
Oui c sur mais si tu as de grosses bases, bonjour l'attente, et les requetes dans les requetes, c pas supporté dans toutes les versions de mySQL
Marsh Posté le 11-12-2003 à 13:01:35
blackPhantom a écrit : |
C'est toujours mieux que de rajouter un champ dans ta base Et donc l'alourdir inutilement
Sans compter l'existence d'index et compagnie... cette opération la est quand même ultra basique.
OK je la ferai pas à chaque insertion, mais y a des moyens pour éviter cela assez connus et simples ...
De plus, tu peux transformer aisément les jointures avec des opérations LEFT JOIN et compagnie sous MySQL => Goto doc MySQL comme je l'ai dit auparavant.
Marsh Posté le 11-12-2003 à 15:18:17
A benwar de juger en fonction de la taille de ces bases; on a pas toutes les données en main pour trouver la meilleure soluce je pense
Marsh Posté le 11-12-2003 à 16:56:39
blackPhantom a écrit : A benwar de juger en fonction de la taille de ces bases; on a pas toutes les données en main pour trouver la meilleure soluce je pense |
Rajouter un champ de booléen pour le traitement dans ta BDD est tout sauf de l'analyse, et est totalement superflu en l'occurence.
Ma solution est aussi efficace, surement plus optimisée que la tienne quelque part d'ailleurs ( on se repose sur le SGBD, qui doit connaitre son boulot ), plus légère en terme de base et beaucoup plus élégante niveau méthode ( Merise/co ).
Bref, la mienne est meilleure, la tienne alourdit inutilement
Surtout que passer par un fichier comme tu le fais, je te raconte pas les opérations d'I/O que tu nous fait... moi je les minimise
Marsh Posté le 11-12-2003 à 18:54:36
blackPhantom a écrit : |
monsieur à de l'humour à ce que je vois. Je pense que les modos ont un peu plus d'humour que toi.
(c'est des sites où les formulaires ont la case "evoyez-mois vos conneries" est déjà pré-cochée ?)
Marsh Posté le 12-12-2003 à 00:24:12
nraynaud a écrit : monsieur à de l'humour à ce que je vois. Je pense que les modos ont un peu plus d'humour que toi. |
sans commentaires...
Marsh Posté le 12-12-2003 à 00:32:22
tetedeiench a écrit : |
As tu deja testé un "Delete from table1 where email IN (Select email from table2);" sur 2 tables à 500 000 enregistrements chacune voire plus ?
Sais tu si sa version de mySQL accepte les sous requetes?
Tant que tu n'as pas ces reponses, je ne vois pas comment tu peux dire que ta soluce est mieux...
Marsh Posté le 12-12-2003 à 00:39:27
Avec les dernières versions de mysql, on peut faire des jointures pour déterminer les lignes à effacer. Ca devrait répondre à ton problème
http://www.mysql.com/doc/fr/DELETE.html
Marsh Posté le 12-12-2003 à 12:47:04
blackPhantom a écrit : |
On peut TOUJOURS eviter les sous requetes en utilisant les jointures supportees depuis BELLE LURETTE par mysql bon sang...
Je t'assure.
Et oui je l'ai deja essayé, et c'était pas si mal que ca.
Donc bon, RENSEIGNE TOI bon sang
Marsh Posté le 12-12-2003 à 14:07:40
tetedeiench a écrit : |
Bien puisque tu l'assures, tu vas donc m'expliquer comment on remplace une sous-requètes dans un delete par une jointure...
Marsh Posté le 12-12-2003 à 20:50:06
gizmo a écrit : |
+1
Mais ou est le principal interessé ???
Marsh Posté le 10-12-2003 à 17:51:34
J'ai une table t_tmp avec un champ email je voudais dans un premier temp supprimer les emails qui son dans la table t_nepasenvoyer puis verifier si dans la table t_email il n'y a pas de doublon avec la table t_temp si oui effacer un exemplaire de chaque doublon dans t_temp puis update sur t_email
Je suis completement dans les choux !