[MySQL] aidez moi à rassembler mes requêtes

aidez moi à rassembler mes requêtes [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 15-12-2004 à 18:28:19    

Hello,
 
Je cherche à rendre l'execution d'un script php le plus rapide possible, et pour ça je voudrais rassembler mes requêtes.
 
Pour commencer je voudrais bien savoir comment il est possible de rassembler ces 2 là :
 

Code :
  1. "SELECT `cat_title`, `scat_id`, `scat_title`, `scat_urlname`, `scat_desc` FROM `" . TABLE_CATEGORIES . "`, `" . TABLE_CATEGORIES_SUB . "` WHERE " . TABLE_CATEGORIES . ".cat_id=" . TABLE_CATEGORIES_SUB . ".scat_cat ORDER BY `cat_order`, `scat_order` ASC";
  2. // après cette selection, intervient une boucle où il y a cette 2ème query
  3. "SELECT `post_time`, `post_poster`, `user_username` FROM `" . TABLE_POSTS . "`, `" . TABLE_USERS . "` WHERE " . TABLE_POSTS . ".post_scat='$tab[1]' AND " . TABLE_USERS . ".user_id=" . TABLE_POSTS . ".post_poster ORDER BY `post_time` DESC LIMIT 1";
  4. // le $tab[1] est en fait la valeur de scat_id de la 1ère selection


(excusez la syntaxe, il y a des constantes php)
 
On fait, je voudrais sortir ma 2ème query de la boucle et faire une seule query pour tout, mais je n'y arrive pas (j'ai notamment des problèmes avec $tab[1]). Je me suis penché sur les JOIN mais je ne sais pas si c'est la solution.
 
merci pour votre aide :)
 
merci
 
edit: ortho


Message édité par Big-Foot le 15-12-2004 à 22:17:32
Reply

Marsh Posté le 15-12-2004 à 18:28:19   

Reply

Marsh Posté le 20-12-2004 à 15:48:04    

alors, c'est possible de rassembler ces 2 requêtes ? Parce que toutes mes tentatives ont échoués.

Reply

Marsh Posté le 21-12-2004 à 17:50:21    

il me semble avoir déja rencontré ce cas, et je m'en étais sorti en "dénormalisant" la base:
tu pourrait ajouter, par exemple, deux champs dans la TABLE_CATEGORIES_SUB qui s'intituleraient scat_last_poster et scat_last_time (ces champs seraient mis à jour lors de chaque insertion)... et ainsi, pas besoin de boucle...

Reply

Marsh Posté le 21-12-2004 à 22:09:52    

Qu'est-ce qui t'empêche de faire une mega jointure monstrueuse entre toutes les tables concernées ?
 
-> La jointure se fait soit avec une clause JOIN appropriée, ou plus classiquement avec FROM et la jointure WHERE idoine.
 
Au pire, tu peux limiter à 2 queries, en passant en paramètre du 2è toutes les valeurs récoltées dans le premier query.
 
-> Clause post_scat IN si permise par le dbms ou, à défaut, WHERE post_scat = v1 AND post_scat = v2 AND ...
 


:love: On doit être les seuls à faire ça.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 23-12-2004 à 15:26:13    

APLC a écrit :

il me semble avoir déja rencontré ce cas, et je m'en étais sorti en "dénormalisant" la base:
tu pourrait ajouter, par exemple, deux champs dans la TABLE_CATEGORIES_SUB qui s'intituleraient scat_last_poster et scat_last_time (ces champs seraient mis à jour lors de chaque insertion)... et ainsi, pas besoin de boucle...


C'est justement ce que je cherchais à éviter, je préfère avoir les informations de mes tables qui ne se répètent jamais.
 

sircam a écrit :

Qu'est-ce qui t'empêche de faire une mega jointure monstrueuse entre toutes les tables concernées ?
 
-> La jointure se fait soit avec une clause JOIN appropriée, ou plus classiquement avec FROM et la jointure WHERE idoine.


Ce qui m'empèche de faire une jointure, c'est que je sais pas comment faire :(
J'ai fouillé les manuels mais je comprends pas à 100% le fonctionnement...
Dans mon cas, sur quoi s'appliquerait le JOIN ?
Quel est la différence entre un LEFT et un RIGHT JOIN ?


Message édité par Big-Foot le 23-12-2004 à 15:26:54
Reply

Marsh Posté le 23-12-2004 à 15:43:00    

Big-Foot a écrit :

Ce qui m'empèche de faire une jointure, c'est que je sais pas comment faire :(
J'ai fouillé les manuels mais je comprends pas à 100% le fonctionnement...
Dans mon cas, sur quoi s'appliquerait le JOIN ?
Quel est la différence entre un LEFT et un RIGHT JOIN ?


Ha, c'est donc là que ça coince  :p  
 
File un peu ton schéma, qu'on y voit plus clair.
 
Tu as fait une belle jointure toute propre dans ton premier query, non ? Tu peux le faire avec 3 tables, c'est idem.

Reply

Marsh Posté le 23-12-2004 à 15:47:30    

tu veux le shéma des tables c'est ça ?
 
Ouai j'ai fait une jointure mais pas avec un JOIN.

Reply

Marsh Posté le 23-12-2004 à 15:55:43    

Je sais pas si c'est ce que tu voulais mais voilà mes tables [pdf].
 
J'avais bien essayé une jointure avec 3 tables comme tu dis, mais il me semble que j'avais un gros problème avec la condition (WHERE).

Reply

Marsh Posté le 23-12-2004 à 22:08:23    

Tu cherches sans doute trop loin; sauf erreur de ma part, ça peut se faire tout connement.
 
- Les noms de tes tables dans ton schéma ne correspondent pas à ceux de ton query, il y a une raison ?
- Les clefs étrangères ne sont pas renseignées : je dois deviner ?  :o  
- D'après le contexte, je crois deviner que df_categorie_sub et df_posts présentent une relation 1-n et que df_posts.post_scat est foreign key vers df_categorie_sub, mais les types ne correspondent pas : mediumint(8) et mediumint(5).
 
Tu as montré que tu savais faire une jointure. Lance-toi, fais-nous, en SQL, une mega-jointure entre tes quatres tables. Tu dois forcément les retrouver toutes les 4 dans la clause FROM. Les jointures se font entre deux champs de chaque table dans la clause WHERE. Donc, 3 jointures à faire.
 
Ne te tracasses pas pour df_posts qui sert de liaison entre df_categories_sub et df_users - si ma boule de crystal m'a bien renseigné, car c'est pas dans ton schéma. Fais les jointures avec chaque table tranquilement.  [:crusty128]
 
A toi de jouer... Ici on ne donne pas des solutions toutes faites, on fais réfléchir et on laisse mariner.
 
Par pur sadisme, c'est évident.  [:aline2003]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed