Système de classement sql un peut spéciale ?

WRInaute passionné
BOnjour,

Bon, sa va pas être simple à expliquer...

J'effectue un classement classique de cette façon:
Code:
$query = mysql_query("SELECT * FROM matable WHERE id = $id ORDER BY id DESC");

Je souhaiterais mettre en place un système qui permet de faire remonter une "info" dans le classement sans avoir pour autant besoin de modifier l'id.

En gros:
-Au point de départ, classement par apport aux derniers enregistrement (sa ,sa ne change pas).
-Ensuite via un espace membre, Mr X veut faire remonter son "info" dans le classement qui date déjà d'au moins une semaine. Mr X clique sur un bouton et il remonte en 1er position dans le classement.
-1heure plus tard une nouvelle info est posté et vient donc "écrasé" celle qui vient d'être remonté pour la descendre en 2 ieme position.
Et ainsi de suite.....

Je sèche complètement sur la façon de procéder... comment faire ce classement, par apport à quoi ou quelle base et quelle serait alors la requête sql du classement ?

Merci de vos lumières.
 
WRInaute accro
Salut, tu peux aussi utiliser la date en timestamp (fonction time()) lors d'un clic pour faire remonter l'info et la générer lors de la création d'une nouvelle info, comme ça tu peux abandonner ton ancien système (order by id desc) et adopter Order by date Desc
 
WRInaute passionné
Merci Marie-Aude mais la je ne comprend pas très bien. Peux tu être un plus explicite stp.

Si sa peut aider un peut:
Actuellement j'ai 5 tables dont une que l'on va nommer TABLE_A qui me permet d'identifier chaque personne inscrite. L'identifiant des personnes se retrouve ainsi dans chacune des autres tables pour me faciliter la jonction entre elles.
 
WRInaute accro
Effectivement, modifier l'id est inadapté. Un identifiant est attribué à la génération de l'uplet et ne doit jamais être modifié.

Cependant rien ne t'empêche d'ajouter un champ "position" qui est un numéro également, que tu te permet de modifier à ta guise.
Et sur lequel tu fait l'order.

C'est ce que Marie Aude proposait je pense.

Ainsi ta requête sql ressemblera à :
SELECT * FROM matable ORDER BY position DESC
 
WRInaute passionné
kazhar, du coup, sur ta requête, le classement se fait uniquement sur le champ position, non ?

Moi je veux que le classement se fasse par id DESC tout en prenant en compte position.

J'ai été voir du coté de la fonction time() proposé par Yoyos qui me parait assez simple.
Il me suffirait, si je ne me plante pas, d'ajouter un champ TIME dont l'action d'un clique enregistrerais en Bd le timestamp du moment.
Par contre, je suis largué sur la requête sql à effectuer pour le classement partant de celle ci:
Code:
$query = mysql_query("SELECT * FROM matable WHERE id = $id ORDER BY id DESC");

Merci de vos conseils

Edit: Après reflection, c'est bon :D
Code:
$query = mysql_query("SELECT * FROM matable WHERE position = $position ORDER BY id DESC");

Merci pour vos réponses apportées :D
 
WRInaute accro
C'est la meilleur solution pour moi. Avec une position en nombre entier, tu risques d'avoir plein d'articles qui auront le même numero, donc faire un tri la dessus ne fonctionnera pas.

Hors, une date, à chaque clic, pour n'importe quel membre, elle est différente ! Ca dépend si tu veux que le truc soit multi-utilisateur ou pas. Si c'est juste pour le membre, ben la position est bien oui, mais ça reste un poil plus dur à mettre en place car il faut faire attention à éviter les doublons :D

Multi-utilisateur:

Code:
$query = mysql_query("SELECT * FROM matable ORDER BY dateclic DESC");

Mono-utilisateur:

Code:
$query = mysql_query("SELECT * FROM matable WHERE id = $id ORDER BY dateclic DESC");

Marie-Aude a dit:
la solution de MagicYoyo

Magic YoyoS alors,sinon c'est pas le même gars :mrgreen:
 
WRInaute passionné
YoyoS a dit:
C'est la meilleur solution pour moi. Avec une position en nombre entier, tu risques d'avoir plein d'articles qui auront le même numero, donc faire un tri la dessus ne fonctionnera pas.

Je crains ne plus comprendre la !
Le timestamp retourne un chiffre entier du genre 1217160464 ou je me plante ?
Code:
<?php
$time = time();
echo 'Nombre de secondes écoulées depuis le 01/01/1970: '.$time.'';
?>
Et c'est bien de ce chiffre que je me sert pour effectuer mon classement?
.... du coup, si je manque de bol, plusieurs "articles" peuvent avoir le même chiffre ... sa y est, je m'embrouille la :?
 
WRInaute accro
tryan a dit:
YoyoS a dit:
C'est la meilleur solution pour moi. Avec une position en nombre entier, tu risques d'avoir plein d'articles qui auront le même numero, donc faire un tri la dessus ne fonctionnera pas.

Je crains ne plus comprendre la !
Le timestamp retourne un chiffre entier du genre 1217160464 ou je me plante ?
Code:
<?php
$time = time();
echo 'Nombre de secondes écoulées depuis le 01/01/1970: '.$time.'';
?>
Et c'est bien de ce chiffre que je me sert pour effectuer mon classement?
.... du coup, si je manque de bol, plusieurs "articles" peuvent avoir le même chiffre ... sa y est, je m'embrouille la :?

Oui tu comprends bien, mais c'est quasi impossible d'obtenir la même date, et quand bien même deux articles soient apparus à la même seconde, je vois pas ce qui pose problème, ils sont à égalité donc le tri sera encore sensé. Si un des 2 articles est mis devant l'autre ou non, c'est normal puisqu'aucun des deux n'a l'avantage ou n'est perdant ^^ Si vraiment tu chipotes, sauvegarde aussi les millisecondes, microsecondes et compagnie alors lol
 
WRInaute passionné
Mais non je ne chipote pas ^^, seulement dans le poste un peut plus haut tu dit:
Avec une position en nombre entier, tu risques d'avoir plein d'articles qui auront le même numero, donc faire un tri la dessus ne fonctionnera pas.
Et vue que time() retourne un nombre entier, tu insinue donc que faire un tri la dessus ne fonctionnera pas, d'ou mon incompréhension :D .
 
WRInaute accro
Moi je voyais time() comme une date :) mais oui, mais oui, tu joues sur les mots ;)

Avec une position en nombre entier, tu risques d'avoir plein d'articles qui auront le même numéro, donc faire un tri la dessus ne fonctionnera pas.

Bon pour commencer, je parlais d'une position, si tu me dis que la date est une position dans une liste, je sais pas ce que je te fais lol

Ensuite, je voulais dire, si tu codes comme un porc, tu peux avoir un article d'il y a 2ans qui a le même numéro que le nouveau et donc quand tu vas trier, ça sera le bordel.

T'as capté ou pas ? Ou faut que j'use complètement mon clavier mdr
 
WRInaute passionné
lol c'est dure la compréhension et je vais tenter de ne pas te faire user ton clavier ^^.

Bon, pour time() on est daccord.

Pour le coté codage comme un porc, c'est possible aussi ^^, je fais avec ce que je "connais" et je teste, re teste et re re teste encore et encore pour m'assurer que tout fonctionne comme je le souhaite.

Par ailleurs, sachant que time() retourne un chiffre entier soit le nombre de secondes écoulées depuis le 01/01/1970 au moment de l'enregistrement, il m'est normalement impossible d'avoir un article d'il y a 2 ans portant un même numéro ... (Je viens de comprendre l'allusion à coder comme un porc..^^).

Merci à toi YoyoS du temps passé à me répondre :wink:
 
WRInaute accro
Ok, le mieux serait que tu testes par toi même en fait, c'est la meilleur solution. Tu te rendras vite compte des méthodes limitées et à problèmes qu'il faut éviter :mrgreen:
 
Discussions similaires
Réponses
3
Affichages
3K
mathieukassovitz
M
Haut