2010-11-15 4 views
3

J'ai deux tables. Une table est destinée à servir d'historique des transactions et l'autre est un journal des détails des membres. Quand un rapport est exécuté, je veux déplacer des parties des détails de membre dans l'histoire de transaction mais également mettre à jour quelques enregistrements de champ qui n'existeraient pas autrement.Est-il possible d'insérer des valeurs d'une table dans une autre et de mettre à jour les valeurs de champs dans la même requête?

Est-il possible de sélectionner tous les enregistrements qui répondent à un critère spécifique, d'insérer uniquement des parties de la ligne correspondante dans une autre table ET de mettre à jour d'autres champs dans une même requête?

Par exemple:

Dans le tableau 2, j'ai nom de membre, date d'inscription, et memberid. Je veux déplacer les enregistrements ci-dessus dans le tableau 1 mais également mettre à jour le champ (status) égal à 'traité'.

Note: J'utilise aussi php et pdo pour me connecter à une base de données mysql.

Est-ce possible dans une seule requête?

+0

Pourquoi voulez-vous faire dans une seule requête? Pourquoi ne pas envelopper deux requêtes dans une [transaction] (http://dev.mysql.com/doc/refman/5.0/fr/commit.html)? – ircmaxell

+0

bon point - plus je réfléchis, plus la seule requête semble inutile ... – JM4

+1

Deux requêtes lisibles et efficaces valent mieux qu'une grande requête compliquée n'importe quel jour de la semaine. Les deux d'un point de vue sémantique et une performance. Ne soyez pas pris dans le piège de moins est toujours mieux (il ya des compromis bien sûr, mais ce n'est pas une vérité universelle) ... – ircmaxell

Répondre

1

Après mûre réflexion - j'ai décidé d'utiliser des conseils de ircmaxell et simplement exécuter plusieurs requêtes. Cela finit non seulement par rendre les choses plus faciles, mais cela me permet de personnaliser mon tri beaucoup plus facilement.

Comme il le dit ci-dessus, « Ne vous laissez pas prendre au piège de moins est toujours mieux »

1

Vous n'avez pas spécifié si les lignes que vous souhaitez mettre à jour sont les mêmes que celles que vous insérez. Je suppose qu'ils sont:

insert into table1 
(member_name, date_registered, memberid, status) 
select member_name, date_registered, memberid, 'processed' 
from table2 
where SomeField = MyCriteria 
+0

question est, im en utilisant des instructions préparées et pdo quand je tente d'exécuter le code avec. .. "select member_name, date_registered, memberid, SET status =? ..." il donne des erreurs. – JM4

0

Oui:

SELECT *, "processed" INTO table2 FROM table1 

Vous devrez adapter en fonction des structures de table, peut-être même écrire tous les champs:

SELECT field1, field2, field3, "processed" INTO table2 FROM table1 

à noter , cela suppose que vous voulez écrire dans la table 2 , y compris la variable traitée (Puis-je suggérer un booléen?) Si vous voulez le "traité" dans l'autre tableau, il sera plus compli cated.

Edit: Apparemment, MySQL ne supporte pas de sélection dans so ...

INSERT INTO table2 SELECT field1, field2, field3, "processed" FROM table1 

Code Redfilters fonctionne

+0

@JV - le problème principal est la clause instruction préparée, je peux simplement exécuter deux requêtes si besoin est parce que je dois exécuter l'instruction ci-dessus dans une boucle basée sur le résultat retourné indépendamment (plusieurs insertions auront lieu ici). – JM4

Questions connexes