Extraction ds données d'une table vers une autre

Eléphanteau du PHP | 23 Messages

17 nov. 2005, 14:09

Bonjour à tous !

Voilà, j'ai 2 tables. La première contient les coordonnées complètes des utilisateurs :
Table `users`
`idUser` INT(11) PRIMARY KEY AUTO_INCREMENT
`nom` VARCHAR(255)
`prenom` VARCHAR(255)
`mail` VARCHAR(255)
`societe` VARCHAR(255)
`adresse` VARCHAR(255)

Dans la seconde, je veux juste avoir le nom, le prénom et le mail :
Table `abonne`
`idAbonne` INT(11) PRIMARY KEY AUTO_INCREMENT
`nom` VARCHAR(255)
`prenom` VARCHAR(255)
`mail` VARCHAR(255)

Je souhaite bien sûr transférer (copier) les données de l'une à l'autre, et de préférence uniquement en SQL. J'ai voulu faire cette requête :

Code : Tout sélectionner

INSERT INTO `test` VALUES ( (SELECT `idUser` FROM `abonnes_newsletter`), (SELECT `nom` FROM `abonnes_newsletter`), (SELECT `prenom` FROM `abonnes_newsletter`), (SELECT `mail` FROM `abonnes_newsletter`) )
Mais MySQL répond

Code : Tout sélectionner

#1242 - Subquery returns more than 1 row
Et je me dis "Evidemment, vu que je veux qu'il me mette tous les enregistrements". Y a-t-il un moyen de faire ce type de requête en boucle en SQL ou dois-je forcément passer par un script PHP?

Si jamais il y a une solution en SQL, est-il possible d'avoir en plus un idAbonne distinct?

Merci de votre aide :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 nov. 2005, 14:18

Tu fait une seule et unique requete pour sélectionner les valeurs à transferer. De plus, comme ton champ idAbonne est auto_increment, si tu ne lui donnes pas de valeur, il va gerer tout seul les incrémentations

Code : Tout sélectionner

INSERT INTO `abonne` (nom, prenom, mail) VALUES (SELECT `nom`, `prenom` `mail` FROM `abonnes_newsletter`)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 23 Messages

17 nov. 2005, 16:31

Code corrigé :

Code : Tout sélectionner

INSERT INTO `test` (`nom`, `prenom`, `mail`) VALUES ((SELECT `nom`, `prenom`, `mail` FROM `abonnes_newsletter`))
Il manquait les parenthèses entourant la sous-requête, cela faisait une erreur de syntaxe. En tout cas, cette requête donne l'erreur :

Code : Tout sélectionner

#1136 - Column count doesn't match value count at row 1
Je pense que MySQL considère la sous-requête comme une seule et unique valeur. Il lui manque donc dans ce cas les valeurs pour le champs `prenom` et `mail`. On revient donc à ma requête de départ... :?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 nov. 2005, 16:44

Non, c'est plutôt qu'il fallait enlever les parenthèses

Code : Tout sélectionner

INSERT INTO `test` (`nom`, `prenom`, `mail`) VALUES SELECT `nom`, `prenom`, `mail` FROM `abonnes_newsletter
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 23 Messages

17 nov. 2005, 17:04

Tu avais oublié l'apostrophe fermante.

Après correction, voici ce que ça me donne :

Code : Tout sélectionner

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT `nom`, `prenom`, `mail` FROM `abonnes_newsletter`' at line 2

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 nov. 2005, 17:18

J'ai pas les yeux en face des trous aujourd'hui
Il ne faut pas de VALUES

Code : Tout sélectionner

INSERT INTO `test` (`nom`, `prenom`, `mail`) SELECT `nom`, `prenom`, `mail` FROM `abonnes_newsletter`
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 23 Messages

17 nov. 2005, 17:22

Yeah ça marche ! :D
Merci beaucoup Zeus !