Requête SQL pénible

WRInaute impliqué
Bonjour,

Généralement, pour mes requêtes SQL je me débrouille mais depuis hier je bute sur un point et je crois que je me complique la vie.

Ce que je recherche, c'est de pouvoir récupérer la date de la dernière modification/ou ajout d'élément d'une fiche. Tout élément ajouté est daté en base dans des tables différentes, je m'explique :

J'ai une fiche (contenu principal) avec sa date. Sur cette fiche, il y a des commentaires visiteurs, des notations, des messages forums, des liens vidéo ou audio... Bref, dès qu'un contenu nouveau est ajouté sur une fiche, j'aimerai récupérer la date de la dernière modification quelque soit l'élément modifié ou ajouté.

Comment faire pour récupérer ces dates proprement sans faire une requête ou multirequête usine à gaz (ce dont je suis en train de faire) ?

Je cherche juste la façon la plus simple de récupérer chaque date simplement, la comparaison de date je sais faire. Autre élément, je dois pouvoir faire un listing de toutes les fiches pour les trier par date de dernière modification.

Merci d'avance si vous avez une idée.
 
WRInaute impliqué
Ce que je ferai, c'est ajouter une colonne sur la fiche indiquant la date de dernière modification. À chaque évènement impliquant la date de dernière modification (commentaire, etc.), tu met à jour cette colonne en conséquence.

Ceci peut se faire soit par le langage de programmation de l'application (PHP) ou en utilisant les triggers. L'avantage des trgger, c'est que tu ne touches pas à ton application.
 
WRInaute accro
Blount a dit:
Ceci peut se faire soit par le langage de programmation de l'application (PHP) ou en utilisant les triggers. L'avantage des trgger, c'est que tu ne touches pas à ton application.
Ou tu met le champ date en "on update CURRENT_TIMESTAMP" et tu te fait pas chi*r avec du code.
 
WRInaute impliqué
Ce que je ferai, c'est ajouter une colonne sur la fiche indiquant la date de dernière modification. À chaque évènement impliquant la date de dernière modification (commentaire, etc.), tu met à jour cette colonne en conséquence.

Ceci peut se faire soit par le langage de programmation de l'application (PHP) ou en utilisant les triggers. L'avantage des trgger, c'est que tu ne touches pas à ton application.

J'y ai pensé, mais il s'agit d'un vieux site (10 ans) qui a des milliers d'entrées (si j'additionne toutes les tables).

Par contre, même si j'en ai déjà entendu parlé, je ne sais pas ce que sont les triggers. Jamais utilisé. Je vais me documenter, si ça peut me faciliter la vie pour plus tard :D.
 
WRInaute impliqué
Zeb > Effectivement sans la structure, ce n'est pas simple. je vais essayé de voir si je peux faire un schéma simplifié.
 
WRInaute impliqué
zeb a dit:
Blount a dit:
Ceci peut se faire soit par le langage de programmation de l'application (PHP) ou en utilisant les triggers. L'avantage des trgger, c'est que tu ne touches pas à ton application.
Ou tu met le champ date en "on update CURRENT_TIMESTAMP" et tu te fait pas chi*r avec du code.

D'après son poste, le champ ne dépend pas forcément de la mise à jour de sa table, mais aussi d'une table tierce. S'il a une table "Fiche" et une table "Commentaire", il est obligatoire de mettre à jour manuellement "Fiche" quand une modification est faites sur "Commentaire" (enfin, je crois).
 
WRInaute impliqué
Oui, c'est tout à fait ça. En gros j'ai besoin de prendre la date la plus récente entre fiche, topic du forum (si existe), le plus récent commentaire (si existe)...

Comme ça me semblait trop chiant à faire, j'ai décidé de récupérer cette date sur chaque action (la plupart en admin) que je mettrai à jour dans une table spéciale. Cela me fait du travail, des scripts à modifier mais au moins je ne vais pas surcharger mon site avec de multiples requêtes boiteuses ou lourdes.
 
WRInaute accro
La méthode suggérée est probablement la plus efficace. Sinon, en Postgresql je suggèrerais de modifier le schéma pour que toutes les tables auxiliaires "héritent" d'une table unique, mais ça n'existe pas en MySQL. Autre option possible en MySQL: tu déplaces tous les champs communs dans une table unique, et tu fais une jointure externe, mais ça impose pas mal de changements dans le code.

Pour finir, la méthode bourrin:
Code:
SELECT GREATEST(fiche.date_modif,MAX(aux.date_modif)) FROM fiche f LEFT JOIN (SELECT id_fiche,date_modif FROM commentaire UNION SELECT id_fiche,date_modif FROM truc UNION SELECT id_fiche,date_modif FROM bidule) aux ON (f.id=aux.id_fiche) GROUP BY fiche.date_modif

Pas testé, mais ça ne doit pas être très loin.

Jacques.
 
WRInaute impliqué
Pas bête et intéressant, je n'y aurais pas pensé (enfin, je n'aurai jamais su faire).

Toutefois, comme je suis têtu et que je voulais absolument trouver une soluce, j'ai créé un script qui a récupéré la date la plus récente de tout ce qu'il y a d'existant et qui est lié à une fiche. J'ai tout mis ça dans une table, lié avec l'ID de la fiche. Pour les prochaines modifications ou ajouts, j'ai mis en place une fonction qui mettra à jour cette table (ou fera des inserts dans le cas d'une nouvelle fiche) à chaque action d'ajout ou de modification. Cela a été un peu chiant à faire d'autant que j'avais 2 outils non créés pour certaines actions (peu récurrentes) que je faisais en BD.
En un après-midi de travail, ça a été tout corrigé et mis en place :).

Merci pour ta suggestion, j'ai un autre site ou ta requête pourrait me servir :D
 
WRInaute accro
Blount a dit:
D'après son poste, le champ ne dépend pas forcément de la mise à jour de sa table, mais aussi d'une table tierce...
Oooops oui en effet j'ai pas assez décortiqué le truc bien vu.
 
Discussions similaires
Haut