Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/05/2011, 15h52   #1
Nouveau Membre du Club
 
Inscription : septembre 2004
Messages : 236
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 236
Points : 35
Points : 35
Envoyer un message via MSN à gotcha5832
Par défaut inverser deux valeur sur un champ UNIQUE

Bonjour a tous,

Voila j'ai un table avec un champ sort_order UNIQUE.

Je souhaiterais pouvoir changer l'order de deux ligne en inversant leur valeur.
j'avais donc penser réaliser deux update a la suite.
Code :
1
2
3
 
tep_db_query("update " . TABLE_CAROUSEL_INDEX . " set sort_order = sort_order - 1 where carousel_index_id = '" . (int)$HTTP_GET_VARS['ci_id'] . "'");
tep_db_query("update " . TABLE_CAROUSEL_INDEX . " set sort_order = sort_order + 1 where carousel_index_id = '" . (int)$audessus['classification_id'] . "'");
Mais le probleme c'est que la premier requete ne peut pas se réaliser car du coup deux valeur seront identique?

du coup comment faire?
j'ai bien penser faire
Code :
1
2
3
tep_db_query("update " . TABLE_CAROUSEL_INDEX . " set sort_order = sort_order +1000 where carousel_index_id = '" . (int)$HTTP_GET_VARS['ci_id'] . "'");
tep_db_query("update " . TABLE_CAROUSEL_INDEX . " set sort_order = sort_order + 1 where carousel_index_id = '" . (int)$audessus['classification_id'] . "'");		
tep_db_query("update " . TABLE_CAROUSEL_INDEX . " set sort_order = sort_order -1001 where carousel_index_id = '" . (int)$HTTP_GET_VARS['ci_id'] . "'");
Mais c'est vraiment pas propre comme developpement. je pense qu'il doit exister un soluce plus adapté

Merci d'avance
gotcha5832 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 17h24   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
C'est impossible, car MySQL n'est pas relationnel, pas ensembliste et ne sait donc pas faire des traitements autrement que ligne à ligne !!!
Vive MySQL qui est un pseudo SGBDR !
A lire sur le sujet :
http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 18h19   #3
Nouveau Membre du Club
 
Inscription : septembre 2004
Messages : 236
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 236
Points : 35
Points : 35
Envoyer un message via MSN à gotcha5832
Par défaut merci

Merci pour votre réponse

Donc ma solution du +1000 , puis -999, elle la solution recommandé?

p.s::sachant que j'aurais 10 - 30 de ligne maximum donc +1000 est largement suffisant
Merci
gotcha5832 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 04h23   #4
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
salut,

une solution peut être, si tu utilises de l'int(4) par exemple de:
faire les updates en faisant ton +/-1 mais en inversant le résultat:
  • -(val+1)=-val-1
  • -(val-1)=-val+1
ensuite refais tes updates en repassant en positif tes valeurs...

c'est pas top, mais ça fait le job, puisqu'à aucun moment tu as de doublon grâce à cette phase intermédiaire...

je te conseille de faire ça grâce à une procédure stockée qui engloberas tes 4 update plutôt que de le faire avec 4 allers-retours php mysql...

mais ta solution marche aussi bien, au pire tu peux verrouiller la table le temps de la mise à jour, pour éviter des accès le temps de la manipulation.
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h23.


 
 
 
 
Partenaires

Hébergement Web