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 13/01/2011, 12h26   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2005
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 13
Points : 11
Points : 11
Par défaut UPDATE un poil complexe, avec rupture et incrémentation

Bonjour tout le monde,

Ça fait longtemps que je n'ai pas fait de SQL, et la je sèche méchant sur un update.

En lecture, j'ai 2 tables. La 1° contient des produits et leur quantité, la seconde elle contient leur placement dans une liste.

Je fais donc ceci pour l'affichage :

Code :
1
2
3
4
5
 
SELECT cat.`id_category`, cat.`position`, pr.`id_product`, pr.`quantity`
FROM `ps_product` pr
LEFT JOIN `ps_category_product` cat ON cat.id_product = pr.id_product
ORDER BY cat.`id_category`, pr.`quantity`
Résultat :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
id_category ;position ;id_product ;quantity
1 	;1 	;2 	;100
1 	;3 	;7 	;180
1 	;2 	;6 	;249
1 	;4 	;5 	;274
1 	;0 	;1 	;800
1 	;3 	;8 	;5001
2 	;0 	;2 	;100
2 	;1 	;7 	;180
2 	;1 	;1 	;800
3 	;0 	;9 	;1
3 	;0 	;8 	;5001
4 	;0 	;6 	;249
4 	;0 	;5 	;274
C'est nickel chrome.

Maintenant, ça devient chaud pour moi.

Je dois réorganiser l'ordre des produits en fonction de leur quantité. Les règles du jeu :
  • Un produit peut être dans plusieurs catégories (id_category ).
  • A chaque changement de catégorie, le premier produit doit avoir position à 1. Les suivants sont incrémentés de 1.
  • L'ordre des produits dans chaque catégorie se fait par leur quantité.

Je souhaite donc faire un UPDATE pour obtenir ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
id_category ;position ;id_product ;quantity
1 	;1 	;2 	;100
1 	;2 	;7 	;180
1 	;3 	;6 	;249
1 	;4 	;5 	;274
1 	;5 	;1 	;800
1 	;6 	;8 	;5001

2 	;1 	;2 	;100
2 	;2 	;7 	;180
2 	;3 	;1 	;800

3 	;1 	;9 	;1
3 	;2 	;8 	;5001

4 	;1 	;6 	;249
4 	;2 	;5 	;274
Et la, c'est le drame, je sèche comme une vieille bouse. Impossible (pour moi) de gérer la rupture sur id_category.

Sauf a scripter une moulinette toute dégueulasse avec des updates en boucle.

Quelqu'un aurait-il une solution, ou un début de piste ?

Merciiiiiii.
Sylv666 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 13h34   #2
Membre éclairé

 
Inscription : mars 2009
Messages : 265
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 265
Points : 372
Points : 372
Hello

Cela n'est pas exactement la solution que tu souhaites mais à ta place si cela est possible je garderai la première requête qui récupère toutes les informations nécessaires.

Puis avec PHP je manipulerai ce joli tableau afin de le trier exactement comme tu le souhaites.

(ou un autre langage si tu n'utilises pas PHP)
__________________
La FAQ référencement c'est les 100 réponses aux 100 questions les plus fréquentes en référencement naturel. Ni plus ni moins.
aurelienbardon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 11h25   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 980
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 980
Points : 18 224
Points : 18 224
Envoyer un message via MSN à CinePhil
Il te faudrait une fonction RANK OVER PARTITION mais qui n'existe pas chez MySQL.

Inspire toit de cet article pour construire ta requête.

Bon courage ! Ton problème n'est pas facile !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 18h11   #4
Candidat au titre de Membre du Club
 
Inscription : janvier 2005
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 13
Points : 11
Points : 11
Merci Cinephil et aurelienbardon.

Je vais certainement traiter ça en parti avec une émulation de ROWNUM (dispo sur oracle) et en parti avec du code comme me l'a proposé aurelien.

Le mix des 2 est super moche, mais au moins ne devrais pas faire tomber le serveur.
Sylv666 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 16h45.


 
 
 
 
Partenaires

Hébergement Web