Comment faire ?

Mammouth du PHP | 1776 Messages

17 oct. 2006, 11:14

Nickel !!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ca fonctionne, ca me permet d'enlever de champ ajouté pour contourner le prob ^^

Merci @ toi et à ceux qui se sont penchés sur le problème :wink:

Eléphant du PHP | 193 Messages

17 oct. 2006, 11:17

Y a vraiment pas de quoi. Je t'avoue être soulagé, j'ai vraiment du mal à travailler dans l'abstrait, la prochaine fois file-moi des tables, pour l'amour du ciel :p

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

17 oct. 2006, 17:15

Ca fonctionne, ca me permet d'enlever de champ ajouté pour contourner le prob
Il y a une raison pour que les développeurs aient ajouté un champs "topic_last_post_id", c'est qu'il est très coûteux de calculer ce champs à la volée.

Attention aux sous-requêtes corrélées (correlated subqueries) elles sont très très coûteuses en terme de ressources, et d'autant plus que tu voudras probablement utiliser le résultat de cette requête pour la clause ORDER BY afin de classer les sujets par ordre de nouveauté, ce qui ôte toute chance à l'optimiseur de réécrire la requête. Au pire, si vous ne pouvez faire autrement qu'utiliser une requête corrélée, vous pouvez la transformer en table dérivée mais là encore c'est très lent parce que le MAX() sera calculé sur l'intégralité de la table.

Dans tous les cas, je ne saurai trop te conseiller de garder ce champ supplémentaire quelles que soient les circonstances.

Au fait, j'ai essayé de réécrire la requête ci-dessous pour donner un exemple de table dérivée mais je n'y suis pas arrivé parce que je n'ai pas trouvé la relation entre la table "a" et la table "t", je pense qu'il manque une condition de jointure non ?

Eléphant du PHP | 193 Messages

17 oct. 2006, 17:21

Je dirais que ceci fait office de jointure:

Code : Tout sélectionner

AND a.etat='1' AND t.etat='1'
ça équivaut à

Code : Tout sélectionner

AND a.etat=t.etat AND t.etat='1'
Pour le reste on est d'accord, cette solution est beaucoup plus lourde en ressources machine.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

17 oct. 2006, 17:29

Je dirais que ceci fait office de jointure
Euh... non :P
MySQL ne lit pas dans les pensées, et si une jointure n'est pas explicite alors il joint tous les enregistrements de la première table à tous les enregistrements de la seconde. S'il y a 100 enregistrements dans la première et 200 dans la seconde ça fait 20000 combinaisons :lol:

Après avoir (re)lu le premier message, je pense qu'il doit y avoir un champs "id_admin" quelque part pour faire la jointure. Auquel cas, mon exemple de table dérivée serait

Code : Tout sélectionner

SELECT t.*, m.id, m.message FROM administrateurs AS a JOIN tickets AS t ON t.id_admin = a.id JOIN ( SELECT id_ticket, MAX(id) AS max_id FROM messages GROUP BY id_ticket ) AS tmp ON tmp.id_ticket = t.id JOIN messages AS m ON m.id_ticket = tmp.max_id WHERE a.etat = 1 AND t.etat = 1
Et la table dérivée pourrait être améliorée parce qu'elle représente le "max_id" de tous les tickets, alors que seuls les tickets dont l'"etat" est à 1 seront utilisés. Même si ça nous fait ajouter jointures dans la table dérivée ça peut être plus performant parce qu'il aura à examiner moins d'enregistrements. Mais bon, dans tous les cas => champs supplémentaire, c'est une meilleure solution.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

17 oct. 2006, 17:56

Qu'est ce qu'il veut le monsieur ?! :-s :lol:
Ben, j'sais pas. Ça doit être indiqué dans le titre de son sujet... :-*

Quand je pense qu'on en a dé-viPHP-isés pour moins que ça... :axe: :lol:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 oct. 2006, 22:01

Qu'est ce qu'il veut le monsieur ?! :-s :lol:
Ben, j'sais pas. Ça doit être indiqué dans le titre de son sujet... :-*

Quand je pense qu'on en a dé-viPHP-isés pour moins que ça... :axe: :lol:
:-({|= :boire4: :boire9:

Non mais je parlais surtout de l'intervention juste avant ce message de "no comprehension" :roll:


Honnêtement ma requête ne sort pas le résultat attendu ?

Dire que je l'ai testé... et re-testé (bien sûr il n'y avait pas les clauses sur les "etat" et "niveau" puisqu'il n'en était pas question à ce moment... quoi je ne cherche pas à me disculper :^o )

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