affichage de la dernière entrée par type

Eléphanteau du PHP | 13 Messages

24 avr. 2012, 16:13

bonjour,
Voilà, j'ai plusieurs type de news sur mon site. J'ai également, une news (de chaque type) pour presque chaque jour de l'année, enregistrée dans l'entrée "datepublication".

Je voudrais afficher la news d'aujourd'hui, et si il n'y en a pas, alors affiché la dernière enregistré. Voilà donc ma requête :
"SELECT id, titre, intro, type, MAX(datepublication) FROM news WHERE datepublication BETWEEN '2012-04-01' AND CURDATE() GROUP BY type";
Mais cela ne fonctionne pas du tout. Et après plusieurs tentatives, je ne vois pas d'où peut provenir le problème :/
Une idée?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 avr. 2012, 18:28

Avec mysql c'est très simple

Les news par ordre décroissant.
Select * from news order by datepublication desc

La dernière news
Select * from news order by datepublication desc limit 1;

Après pour avoir la dernière news de chaque de chaque type en une seule requête ça va êtres plus complexe

Il te faut :
- la date de dernière news de chaque type de news
Select max(datepublication) from news group by type

Les id correspondand
select id from news where datepublication in(requête 1)

Au total select * from news where id in(requête 2);

Bon la c'est la version bourrin mais qui doit fonctionner.

Je vois pas trop d'autre solution, je verrais si je vois mieux en rentrant.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 13 Messages

24 avr. 2012, 19:26

j'étais parti également sur ce genre de piste avec un :
SELECT * FROM news HAVING datepublication IN (SELECT MAX(datepublication) FROM news GROUP BY type) ORDER BY datepublication DESC
, mais ton code me semble plus intéressant. Je vais essayer :)

Eléphanteau du PHP | 13 Messages

25 avr. 2012, 15:34

Après quelques heures à me casser le crâne je reviens vers vous.
J'ai testé la requête de moogli, mais le problème (c'est de ma faute je me suis mal exprimé), c'est que cela retourne la dernière news, celle qui a la date de publication la plus haute. Or dans mon système, il y a des news pour les 365jours de l'année, pour cela j'ai créée une entrée "datecréation" et "datepublication".
Donc il faut que je sélectionne celle d'aujourd'hui ou du dernier jours.

ma requête:
SELECT * , max(datepublication )
FROM news
WHERE datepublication
BETWEEN '2012-01-01'
AND CURDATE( )
GROUP BY type
Je recherche la date de publication la plus importante entre le 1 janvier et aujourd'hui. Et je ne sélectionne qu'une réponse en triant par type de news.

Je pensais que cela fonctionnait, et ça semble le cas. Mais je viens de modifier les dates de publication de deux donnée d'un même groupe et je remarque que c'est toujours la seconde entrée qui m'est fourni, même si je fait un tris par ordre décroissant/croissant.

Le pire c'est que sur phpmyadmin, je vois que dans le champs max(datepublication), la date correspond au résultat que je recherche et est supérieur à la seconde entrée affiché.

Avez vous une idée d'où cela peut provenir?

ViPHP
ViPHP | 2577 Messages

25 avr. 2012, 16:03

Les valeurs retournée par des colonnes ne faisant pas parties du "group by" et sans fonction de type min, max... sont prises au hasard. D'ailleurs d'autres SGBD refuse leur utilisation.

A priori, tu ne peux pas t'en sortir par une requête s'il peut y avoir 2 news à la même date (sauf à mettre date + heure pour l'unicité) ou s'il n'y a pas un id qui s'incrémente et que la publication est immédiate.

Une solution à tester :
1) Création d'une vue basée sur select type,max(datepublication) as datepublication from news group by type
2) une jointure sur la table news et sur la vue avec le type et la date comme critère.

Une autre solution : idem précédente en se basant sur le Max(id) (sans le type)

Eléphanteau du PHP | 13 Messages

25 avr. 2012, 16:15

Aucune news n'a la même date qu'une autre, voilà pourquoi je me permet d'utiliser CUREDATE(). Et l'id s'inscrémente.
Je vais essayé de creuser ta piste, mais je t'avoue que pour moi tout ça est un peu vague :/
Merci !

ViPHP
ViPHP | 2577 Messages

26 avr. 2012, 09:22

Pour la création de la vue (à ne faire qu'une fois via phpmyadmin par exemple):
create view derniere_news as select type,max(datepublication) as datepublication from news group by type
Tu peux vérifier le fonctionnement avec select * from derniere_news pour voir si c'est ok
Ensuite select * from news A, derniere_news B where A.datepublication=B.datepublication and A.type = B.type

Autre :
create view derniere_news as select type,max(id) as id from news group by type
Tu peux vérifier le fonctionnement avec select * from derniere_news pour voir si c'est ok
Ensuite select * from news A, derniere_news B where A.id=B.id


cas 1) Si tu crées 2 news du meme type le même jour, ca affichera les 2 news de ce type et pas une seule (si ce sont les dernières)
cas 2) Si tu as un système de publication en fixant une date de publication, tu affiches la dernière créée et pas la dernière publiée.