Simplifier ma requete ?

Eléphant du PHP | 94 Messages

30 mai 2006, 08:31

Bonjour

J'ai des articles qui peuvent apparaitre dans 3 rubriques.
je souhaite faire apparaitre sur une page les derniers articles de chaque rubrique.
J'ai une table pour les articles et une table qui gère l'appartenance à une ou plusieurs rubriques.

Pour le moment, je gère mon besoin avec 3 requetes (1 requete par rubrique) du type:
	$reqram = "SELECT filinfo.id, filinfo.dcrea, filinfo.titre, DATE_FORMAT(dcrea, '[%d/%m - %H:%i]') AS 'dcreation', refinfo.ref, refinfo.idinf"
				. " FROM filinfo, refinfo"
				. " WHERE filinfo.id = refinfo.idinf"
				. " AND refinfo.ref='ram'"
				. " ORDER BY filinfo.dcrea DESC"
				. " LIMIT 1";
Comme je débute, je me demandais, par curiosité, si ma méthode était la seule ou s'il existait un moyen plus simpe de couvrir mon besoin avec une requete unique.
Je n'ai pas de problème de perf. C'est juste pour apprendre.
rspir

Mammouth du PHP | 536 Messages

30 mai 2006, 09:13

Il me semble que ton post n'est pas dans le bon forum, tu devrais essayer de le poster dans SQL & Bases de données.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Eléphant du PHP | 353 Messages

30 mai 2006, 09:37

oui , tu peux lier des tables avec JOIN .
Tu pourras trouver les infos à ce sujet ici => http://www.prosygma.com/telechargement/ ... torial.pdf

page 11 du pdf

ou encore

http://dev.mysql.com/doc/refman/5.0/fr/join.html

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

30 mai 2006, 09:44

Pour que quelqu'un te fasse d'éventuelles suggestions, il faudrait aussi que tu nous explique un peu la structure de tes tables

Tu sais sûrement très bien à quoi correspondent filinfo, refinfo, ref, indinf et le reste, mais pas nous.

Eléphant du PHP | 94 Messages

30 mai 2006, 20:50

Pour que quelqu'un te fasse d'éventuelles suggestions, il faudrait aussi que tu nous explique un peu la structure de tes tables

Tu sais sûrement très bien à quoi correspondent filinfo, refinfo, ref, indinf et le reste, mais pas nous.
Oui effectivement
J'ai donc, comme je le disais dans le 1er post, 2 tables.
Une table qui contient les articles : filinfo avec les champs id, dcrea (date de création), titre (titre de l'article)
Une table qui gère les associations article / rubrique : refinfo avec les champs idinf (qui correspond à l'id de l'article) et ref qui correspond à la rubrique.

Ma requete va donc chercher les articles et leur rubrique. Le lien est assuré avec
WHERE filinfo.id = refinfo.idinf"
.
Comme je veux le dernier publié, je fais un tri décroissant en ne prenant que le premier de la liste :
" ORDER BY filinfo.dcrea DESC" 
                . " LIMIT 1"
Et comme, je veux le dernier article par rubrique, j'ai donc fait 3 requetes (une par rubrique). La différence entre ces 3 requetes repose sur le filtre sur la rubrique :
" AND refinfo.ref='rae'" 
" AND refinfo.ref='ras'" 
" AND refinfo.ref='ram'" 
EDIT :
Il me semble que ton post n'est pas dans le bon forum, tu devrais essayer de le poster dans SQL & Bases de données.
Effectivement, j'ai hésité ... en tout cas merci au modérateur d'avoir déplacé mon post dans le bon forum
rspir

Mammouth du PHP | 19672 Messages

30 mai 2006, 21:03

à mon avis, tu devrais explorer la clause GROUP BY sur l'identifiant de rubrique pour avoir un article de chacune des trois... puisque 3 il y a :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 94 Messages

30 mai 2006, 21:25

J'ai tenté le code suivant :

Code : Tout sélectionner

SELECT filinfo.id, filinfo.dcrea, filinfo.titre, DATE_FORMAT( dcrea, '[%d/%m - %H:%i]' ) AS 'dcreation', refinfo.ref, refinfo.idinf FROM filinfo, refinfo WHERE filinfo.id = refinfo.idinf GROUP BY refinfo.ref ORDER BY filinfo.dcrea DESC LIMIT 3
ca me sort bien un enregistrement par rubrique mais pas les derniers créés
rspir

Mammouth du PHP | 19672 Messages

30 mai 2006, 22:10

Peut-être bien que ta clause ORDER BY n'est pas sur la bonne colonne ? :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 94 Messages

30 mai 2006, 22:12

Faut il nécessairement que la clause ORDER pointe sur un champ de la même table que la clause GROUP ?

EDIT : j'avais un TIMESTAMP sur ma table refinfo. J'ai tenté le coup pour voir. Pour une raison que je ne comprends pas il me prend que les premiers enregistrements de chaque rubrique ...

EDIT2 : en fait la clause order by joue sur la restitution : il me tri pas date décroissant les premiers enregistrements qu'il a trouvé dans le group by alors que je voudrais que le tri par date soit fait avant le group by pour n'avoir que les enregistrements les plus récents. Peut être faut il rester sur mes 3 requetes ?
rspir

Mammouth du PHP | 19672 Messages

30 mai 2006, 22:27

Tu peux utiliser plusieurs champs dans une clause ORDER BY : faute d'une idée précise de la structure de tes tables, j'ai un peu de mal à visualier, mais tu pourrais ajouter le champ dcrea dans ton tri.

Je reste convaincu qu'on peut obtenir le bon résultat en une seule requête : reste à réussir à la construire. :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 94 Messages

30 mai 2006, 22:45

Mes tables sont super simples :

refinfo :
id (clé primaire) int (11)
idinf int (5)
ref char (3)
maj (timestamp ON UPDATE CURRENT_TIMESTAMP)

filinfo :
id (clé primaire) int(5)
titre varchar(100)
texte text
dcrea datetime (que j'incrément en php avec now() à la création de l'article
maj (timestamp ON UPDATE CURRENT_TIMESTAMP)

La dernière requête que j'ai testé est :

Code : Tout sélectionner

SELECT filinfo.id, filinfo.dcrea, filinfo.titre, refinfo.maj, refinfo.ref, refinfo.idinf FROM filinfo, refinfo WHERE filinfo.id = refinfo.idinf GROUP BY refinfo.ref ORDER BY filinfo.dcrea DESC , refinfo.maj DESC LIMIT 0 , 30
pas mieux ... j'ai les premiers ... pas les derniers !
rspir

Mammouth du PHP | 19672 Messages

30 mai 2006, 22:54

Alors inverse : utilise ASC au lieu de DESC :

Code : Tout sélectionner

SELECT f.id, f.dcrea, f.titre, r.maj, r.ref, r.idinf FROM filinfo AS f, refinfo AS r WHERE f.id = r.idinf GROUP BY r.ref ORDER BY f.dcrea DESC , r.maj ASC LIMIT 0 , 30
Note : l'utilisation d'un alias rend les requête plus claires à lire (de mon point de vue) d'où les modifications de préfixes.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 94 Messages

30 mai 2006, 22:59

Comme je débute, je n'ai pas encore eu le temps de mettre en place toutes ces petites astuces (comme les alias) qui pourtant effectivement facilitent bien la vie ...

Bon pour la requete c'est pas mieux ... c'est fou...
J'ai relancé ma requete de départ (que je passe 3 fois en changeant le where) et j'ai bien des enregistrements que je viens de créer dans la dernière minute.

Mais avec cette requete il ne me sort que les premiers. C'est comme si le tri se faisait après le group by.

Sinon je suis d'accord avec toi : il doit y'avoir une soluce pour le passer en une requete unique. Y'a t'il d'autres clause qui pourrait servir ?
rspir

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

31 mai 2006, 00:05

Sans vouloir briser votre rêve de requête unique je pense que ce ne soit pas possible tel quel.

En tous cas pas avec un regroupement simple sur la date et un quelconque ordre dessus puisque l'ordre se fait après le regroupement et le regroupement sur un type va forcément prendre le 1er enregistré et non le dernier.

J'ai pas de requête miracle sous la main ou alors des requêtes pas plus optimisées que les 3 proposées :?

Enfin si vous trouvez ça m'intéresse enfait :langue:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 94 Messages

31 mai 2006, 00:08

Donc mes 3 requetes ... c'etait bien ??
Ceci dit, cela fonctionne en l'état, je voulais juste apprendre à optimiser. Je trouvais mes requetes répétitives ...
rspir