OVH Community, votre nouvel espace communautaire.

Question MySql classement données


izzyway
23/05/2007, 10h20
Bonjour,

Si j'ai bien saisi, il y a une table pour les thèmes de photos et une table pour les photos. Donc il est clair qu'il ne faut pas toucher aux ids pour ne pas casser la relation entre ses deux tables.

La solution que je proposais, pour éviter d'avoir a faire de gros update, est d'ajouter une colonne à votre table de thème, cette colonne contient l'id du théme qui suit. Cette solution est assez optimisée pour les update et insert mais rend le select compliqué sauf si vous selectionnez toute la table (ce qui semble être votre cas). Il est facile alors de mettre les données dans un tableau et de naviguer d'id en id.

Sinon la solution d'Abogil est bonne sauf que pour éviter les updates massifs ou les doublons dans la colonne IMPORTANCE vous pouvez utiliser un DOUBLE ou un FLOAT. Et pour calculer cette valeur une simple opération, la colonne IMPORTANCE d'un théme est égale à la moyenne de la colonne IMPORTANCE des thémes qui l'entourent. Cette solution est beaucoup plus simple mais je l'aime moins car dans l'absolu même un DOUBLE n'est pas extensible à l'infini (mais bon, vous avez le temps de voir venir quand même)...

crole
22/05/2007, 23h01
Re,
dans ce genre de cas, comme dit izzyway garde un id fixe (pas une idée fixe) pour la liaison avec les photos.
Il va falloire que tu ajoute des champs à ta table.
J'ai eu un cas similaire et je te conseille de regarder du côté des arbres intervallaires car je suppose que ton client va vouloir ajouter des sous-catégories (et des sous-sous-catégories) d'ici peu. (et tu va être dans la m...)
C'est un peu contraignant à mettre en place mais génial à l'utilisation.
Une explication pas mal faite : http://sql.developpez.com/arborescence/

asba
22/05/2007, 22h35
ok, merci c'est ce que je fais jusqu'à maintenant

Merci quand même ...

Abogil
22/05/2007, 22h08
Citation Envoyé par asba
Par contre izzyway, j'ai peur de ne pas comprendre ton idée que chaque element connait celui qui le suit et le précède.Merci
La méthode d' izzyway est astucieuse, mais alors la méthode de tri des résultats de la requête doit consommer beaucoup de ressources.

Abogil
22/05/2007, 22h04
C'est pourtant simple.

Tu ajoutes une colonne Importance.
Tu fait un petit script pour que ton photographe puisse lui-même mettre une valeur dans la colonne importance.
Par exemple : 0 => Très important, 9999 => peu important.
Pour ton affichage tu fais un SELECT . . . ORDER BY Importance ASC

asba
22/05/2007, 21h57
Par contre izzyway, j'ai peur de ne pas comprendre ton idée que chaque element connait celui qui le suit et le précède.

Comment celà se met-il en place ?
Merci

asba
22/05/2007, 21h54
Bon, je vais clarifier la situation en vous expliquant plus clairement de quoi il s'agit :

Site d'un photographe;
Table des thématques traitées avec un id par thématique: (il en ajoute de manière complétement arbitraire selon l'importance qu'il donne au sujet qu'il vient de traiter )

La remarque précédente est donc très juste car il existe aussi une table des photos liée à celle des thématiques ...

Je suis vraiment d'un niveau assez faible en sql, j'essaie juste de trouver la méthode adéquate pour permettre a mon client d'opérer ce classement de manière arbitraire depuis son admin.

J'ai beau me creuser la tête, sans élément de classement, je n'y arrive pas ...et il apparait maintenant evident qu'il ne faut pas que je touche à l'id auto_increment qui sert de base à la liaison avec les photos.

dur dur

crole
22/05/2007, 18h23
Citation Envoyé par izzyway
Un id n'est pas censé être modifié ou alors ce n'est pas un id. Je pense que votre architecture n'est pas très correcte.

Une colonne dédiée à l'ordonnancement souhaité me semble inévitable.

Personnellement, j'opterais pour une chaîne, chaque élément de la table connaît l'élément qui le suit. Ainsi, à l'ajout d'un élément seul un update est utile (en plus de l'insert).
Hello,
je parle plus par logique que par connaissance. Je n'ai jamais eu de cours d'architecture de base mais je suis un peux matheux quand même.
Comme toi, je pense qu'un "id" en tant que tel et qui sert à la liaison entre tables ne peut pas être modifié. Mais dans le cas où aucune liaison n'est nécessaire, la clé primaire peut être attribuée à n'importe quel champ qui le permet et dans ce cas, la fonctionnalité "autoincrément" n'est qu'une facilité.
Notre amis a utilisé le nom "id_ordreaffichage" mais il aurait pu utiliser "num_ordreaffichage" et s'en servir de clé primaire puisque unique en évitant ainsi d'ajouter un champ et de gonfler la taille de la base.
Pour l'ajout, ta solution est effectivement moins "lourde" mais il me semble (et c'est un avis personnelle) que la requête de lecture (avec chaque élément qui connait sont suivant) sera beaucoup plus lourde. Et la lecture se fait beaucoup plus souvent que l'écriture.

izzyway
22/05/2007, 16h06
Un id n'est pas censé être modifié ou alors ce n'est pas un id. Je pense que votre architecture n'est pas très correcte.

Une colonne dédiée à l'ordonnancement souhaité me semble inévitable.

Personnellement, j'opterais pour une chaîne, chaque élément de la table connaît l'élément qui le suit. Ainsi, à l'ajout d'un élément seul un update est utile (en plus de l'insert).

asba
22/05/2007, 14h18
Merci Crole celà me semble bien ...
A tester

crole
21/05/2007, 14h53
Hello,
je ne crois pas qu'il existe d'instruction toute faite mais de toutes façons, que tout se fasse en une requête ou en deux revient quasi au même point de vue boulot serveur.
Rien ne t'empêche de faire :
Code:
    UPDATE  `nom_table`  SET  `id_ordreaffichage`=`id_ordreaffichage`+1 WHERE  `id_ordreaffichage`>4 ORDER  BY  `id_ordreaffichage`  DESC
même sur une clé primaire. Mysql se chargera de modifier la valeur du prochain auto_increment. (le ORDER BY DESC est important pour éviter les "colisions")
Et ensuite, tu fais to INSERT avec `id_ordreaffichage`=5

asba
21/05/2007, 13h24
Merci pour ta réponse Abogil

J'ai bien pensé à cette méthode qui me parait assez "bricolée", comme tu le précises j'aurais bien voulu que tout se passe sur la clé primaire qui est en auto_increment.

Je cherchais une fonction du type INSERT AFTER id_ordreafichage = n et que ca renomme tous ceux qui suivent .

S'l n'existe rien de prévu pour je vais donc tenter d'appliquer ta méthode.

Merci

Si quelqu'un a une autre idée je suis tout ouie

Abogil
21/05/2007, 07h35
Ta colonne id_ordreaffichage est-il la première colonne ?
Si oui, tu ne peux rien faire.

Pour ton problème je te propose de créer une deuxième colonne Id_affichage que tu mettras juste après la première colonne.
Dans cette colonne Id_affichage tu recopieras la valeur de id_ordreaffichage en la multipliant par 100.
Quand tu voudras insérer un nouvel élément de manière arbitraire entre l'Id_affichage "400" et "500" , il te suffiras de mettre la valeur à mi chemin entre les valeurs précédentes et suivantes de Id_affichage, soit 450.
Tu feras ensuite un SELECT . . . ORDER BY Id_affichage ASC

asba
20/05/2007, 23h52
Bonjour,
Ma question est simple mais je n'y trouve aucune réponse :

Quelle méthode puis-je utiliser dans une table contenant un id_ordreaffichage pour lorsque je souhaite insérer un nouvel élément de manière arbitraire entre l'id_ordreaffichage "4" et "5" renommer automatiquement les éléments "5" "6" "n" en "6" "7" ... ou existe-t-il une methode moins lourde ?

Merci d'avance pour vos idées ou remarques