Simplifier ma requete ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Simplifier ma requete ?

par Truc » 31 mai 2006, 00:18

Donc mes 3 requetes ... c'etait bien ??
Je n'ai pas dis ça non plus mais confronté au même souci je n'ai pas trouvé mieux (pas faute d'avoir cherché... mais il n'y a pas de temps à perdre pour une optimisation minime (suivant la taille de la table)) .

par rspir » 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 ...

par Truc » 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:

par rspir » 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 ?

par Cyrano » 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.

par rspir » 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 !

par Cyrano » 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

par rspir » 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 ?

par Cyrano » 30 mai 2006, 22:10

Peut-être bien que ta clause ORDER BY n'est pas sur la bonne colonne ? :-k

par rspir » 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

par Cyrano » 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

par rspir » 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

par ouckileou » 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.

par Tictac » 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

par béka » 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.