Numéros de page et tri sur champ date [php / mysql] - PHP - Programmation
Marsh Posté le 29-01-2008 à 12:49:02
A mon avis j'ai pas du etre très clair ^^'
Voici un exemple
On affiche 2 news par page max avant de passer a la page suivante .
Enregistrement :
|
A l'affichage on trie les resultats sur le champ "date"
... ORDER BY date DESC |
Sur la premiere page on devrait voir la News B & C
Sur la seconde ca devient problématique du fait que les news A, D et E ont la meme date. Comment savoir si sur la page 2 nous auront A & D ou A & E ou encore E & D ?
Comment savoir rien qu'en ayant l'ID de la news D par exemple si elle sera sur la page 2 oU 3 ? Sans pondre un truc tout dégueu sur php ...
La fonction Mysql DE rêve serait :
SELECT Get_Record_Position("news", "id=1", "date DESC" ) AS pos |
Argument 1 : Table utilisée
Argument 2 : ID de l'enregistrement
Argument 3 : Ordre de tri qu'on utiliserait
Biensur c'est un beau reve mais c'est pour illustrer ce que je voudrais faire le plus simplement possible
Si date etait un champ unique ca ne poserait aucun probleme, mais comme c'est pas le cas,...
Gat$
Marsh Posté le 29-01-2008 à 14:21:16
Ca n'existe pas et c'est bien le problème de tous les systèmes de pagination: arriver à définir la position de l'index sans pour autant tout recalculer à chaque fois.
Et d'ailleurs tu le devines comment toi ton id à partir duquel tu veux tes enregistrement puisque l'ordre du tri et l'ordre des ID ne doit pas influer dans un tel système
Enfin sans parler de performances il y a le limit de mysql sinon http://www.nexen.net/articles/doss [...] _limit.php
Marsh Posté le 29-01-2008 à 15:07:13
Je dois pouvoir connaitre quel sera le numero de page rien qu'avec l'id, pourquoi ? Simple, j'ai un moteur de recherche intégrés au site.
Lorsque les resultats apparaissent il ya un liens qui mene vers le contenu complet, et je dois pouvoir prevoir le n° page afin que lorsqu'on click sur le liens on arrive a coup sur sur la page qui contient le contenu recherché...
Donc si parmis les resultats il ya une news qui a pour date 2005-01-01 (non unique) comment savoir comment MySQL va trier les resultats avec une meme date ?
On aurait pu imaginer qu'un id supérieur a un autre soit automatiquement plus rescent qu'un autre hors ce n'est pas le cas dans mon cas de figure.
La news ayant l'ID n° 10 et une date 2005-01-01 sera plus ancienne que la news ayant l'id n°5 et une date 2006-01-01 (je me doit d'envisager cette posibilité car le client peut modifier la date des news)
merci pour ta réponse
D'autres idée ?
Gat$
Marsh Posté le 29-01-2008 à 15:26:29
Bin sinon pour MySQL il te retournera les valeurs selon l'ordre d'entrée ...
p.ex. tu rentres 3 news le même jour, (le coup des B, D et E) si tu n'en affiches que 2 par page, les 2 affichées puisqu'elles sont à égalité sur le critère de tri seront retournées dans leur ordre d'insertion dans la base. Mais je ne sais pas si c'est un comportement par défaut ou modifiable, c'est un constat perso.
Marsh Posté le 29-01-2008 à 16:08:46
Le prob c'est que c'est pas assez fiable, que se passe-t-il si on a plei nde DELETE , UPDATE etc... ou si on dump la base pour la recreer ailleur ? L'indexe ne sera ptete pas le meme
Marsh Posté le 29-01-2008 à 16:25:40
ReplyMarsh Posté le 29-01-2008 à 17:57:42
leflos5 a écrit : Mais quel est ton problème en fait |
j'arrive pas a m'expliquer correctement
Le prob n'est pas l'affichage des news, ca c'est pas un probleme.
- Les news sont triée par date ordre decroissant (les plus rescente en premier
- Il peut y avoir plusieurs news ayant la meme date
- La date est modifiable par l'utilisateur a volonté
- On affiche 10 news par page
Jusque la pas de probleme..
- J'ai ajouté un champs recherche qui recherche de toute dans le site dont des news
- Mon probleme est que dans le cas ou il y a plusieurs news qui ont une meme date, la recherche risque de ne pas choisir la bonne page dans la quelle se trouve la news du fait qu'on ne sait pas comment mysql va trier des news de meme date
En language SQL ca donne :
Affichage des news suivant la page :
SELECT * FROM news ORDER BY date DESC LIMIT ($cur_page-1) * $nb_resultat_par_page, $nb_resultat_par_page; |
Dans la recherche si une news est trouvé correspondant a certain mot clé, on recupère l'ID de cette news. Mettons ID=3. Pour trouver la page qui correspond a cette news je fait comme ceci :
On recupere les infos de la news trouvée :
SELECT * FROM news WHERE id=3 |
On a donc la date de la news, sur base de la date on cherche le numero de page ou la news est sencée se trouver
SELECT COUNT(*) AS nb_news FROM news WHERE date <= $news_data['date'] AND id <> $news_data['id']; |
j'ai donc le nombre de news qui se trouve avant la news concernée, et sur base de ce nombre je peux calculer a quelle page se trovuera la news.
OUI mais, lorsque plusieurs news ont une meme date, il y a probleme, risque que la page trovuée ne soit pas la bonne, du fait qu'on e sait pas trop commetn mysql va trier ces news ayant uen meme date.
Tri sur l'ID en deuxieme lieux et rajouter un critere a la derniere r equete ci-dessus ? Certain enregistremetn risque d'être zappé si un ID ancien a une date rescente, et un id rescent une date ancienne. Donc autre probleme.
Faire un champ date_reelle (qui garderait la date reelle a la quelle la news a ete cree dans la table ? Meme probleme qu'avec les ID.
Voila il manque vraiment une methode pour savoir quel idnex a tel ou tel enregistrement dans mysql
Marsh Posté le 30-01-2008 à 13:45:28
Je crois avoir déjà mieux saisie, ce qui me manque c'est pourquoi tu fais ça
Si je résume, tu as des news avec un système de pagination.
Tu as un moteur de recherche qui cherche sur tout le site dont autre chose que des news.
Dans le cas d'une news tu veux faire un lien sur la page de la news dans les résultats de la recherche.
C'est ça
Pourquoi vouloir afficher la new sur sa page et pas la new seule vu que c'est elle seule qui est choisie par le moteur
On en revient à ce que je disais, c'est bien le bon problème que j'avais ciblé au départ, c'est impossible de savoir où t'es dans le jeux de résultat comme ça de base. C'est à toi de trouver un truc, parce que le nombre de résultats dépend des critères que tu poses, donc de toutes manières faut systématiquement rebalayer tout le jeu de résultat
Autant rajouter le numéro de la page dans les données, à l'ajout suffit de récupérer le dernier numéro de page et le nombre d'éléments pour définir le bon. A la suppression et bah on redéfinit tout
Marsh Posté le 30-01-2008 à 16:16:17
leflos5 a écrit : Je crois avoir déjà mieux saisie, ce qui me manque c'est pourquoi tu fais ça |
Bah tu as tout compris à mon probleme...
Je voulais éviter les solution porcasses, mais apparament j'ai pas le choix avec mysql
Citation : Pourquoi vouloir afficher la new sur sa page et pas la new seule vu que c'est elle seule qui est choisie par le moteur |
C'est ce que j'ai fait en attendant, mais ca signifie que je me suis laissez avoir le dessus par ce c***** de language de programmation xD
Au pire je peux faire comme tu dis, sauver le numero de page, mais a premiere vue ej trouvias ca un peu bidon ^^
Voila tkx au moins je suis fixé
Gat$
Marsh Posté le 30-01-2008 à 17:38:16
Sinon suffit de calculer avec la requête la position, mais ça t'oblige à effectuer une requête à chaque fois, pas terrrible. D'où la solution de stocker la page
Y'a rien de porcasse à php ou mysql, c'est une contrainte de sql et de conception normalisée
Marsh Posté le 29-01-2008 à 12:04:00
Bonjour à tous,
J'ai un petit soucis que je n'arrive pas a résoudre de moi-même, malgrés pas mal de recherche sur le net, donc je crack je poste
En fait j'ai une table de news qui contient des newsletters.
Table news :
id
date_news
titre
etc...
Lorsque quelqu'un ajoute une nouvelle news le champ date news est garni par defaut avec la date actuelle.
J'ai fait un systeme de pagination qui permet de ne pas avoir 25.000 news sur la même page...
j'affiche donc 10 news par page.
Ce que j'essaie de faire :
Je voudrais a la simple connaissance de l'identifiant ID de la news, connaitre son numéro de page.
En principe je n'ai pas ce genre de probleme, car généralement a l'affichage je trie sur un champ unique.
Mais la il ya le probleme que plusieurs news peuvent avoir la meme date.
Donc si je compte le nombre d'enregistrement dont la date est < que la news concernée, ca va me retourner un nombre d'enregistrement érroné (du moins de temps en temps).
Il faut savoir que la date de la news est modifiable par le client (il s'agit d'un cms) donc un ID supérieur a un autre peut avoir une date inférieure etc...
Donc voila je ne vois pas trop comment gérer la bête, j'ai tenté de voir du coté de mysql si il y avait une fonction ou opérateur permettant de connaitre la position exacte qu'aura un enregistrement lors d'un select (avec les conditions) un peu dans l'idée de MYSQL_CALC_FOUND_ROWS même si c'est pas tout a fait ca
Des idées ?
Merci d'avance tlm
Gat$
Message édité par Gat$ le 29-01-2008 à 13:11:07