Mammouth du PHP |
19672 Messages
03 août 2011, 12:32
Curieuse requête...
La seconde sous-requête n'a pas vraiment de sens, pourquoi ne pas directement utiliser le LIKE ? Pour la première, on dirait qu'à priori tu cherches l'adresse et le téléphone du dernier utilisateur enregistré : comme je présume que tes clés primaires sont en AUTO_INCREMENT, l'utilisation de MAX au lieu de last_insert_id sera à mon avis plus efficace.
Ensuite, pourquoi des jointures gauches ?
As-tu fait un EXPLAIN sur ta requête pour tenter de voir comment MySQL interprête ça ?
Sinon, pour améliorer la lisibilité, je suggère l'utilisation d'alias. Ta requête après quelques modifications simples ressemblerait alors à ceci :
SELECT
us.civilite,
us.name,
us.prenom,
us.score,
tl.telephone
FROM users us
INNER JOIN users_Adresse_link ul ON us.UserID = ul.UserID
INNER JOIN Adresse ad ON ul.AdresseID = ad.AdresseID
INNER JOIN users_telephone_link ut ON us.UserID = ut.UserID
INNER JOIN telephone tl ON ut.telephoneID = tl.telephoneID
WHERE us.UserID = (
SELECT MAX(UserID)
FROM users
) AND tl.telephone LIKE '%". $search ."%'
ORDER BY us.USERID DESC;
Il restera quand même un problème : tu as mis une limite (que j'ai retirée dans la correction de base) mais sans ça tu vas obtenir un produit cartésien du nombre d'adresses par le nombre de numéros de téléphones de l'utilisateur. Mais comme tu ne récupères absolument aucune données de l'adresse, la jointure sur les tables users_Adresse_link et Adresse n'a absolument aucun intérêt et ça ne peut que ralentir le tout. Donc un second ménage aboutira à ceci :
SELECT
us.civilite,
us.name,
us.prenom,
us.score,
tl.telephone
FROM users us
INNER JOIN users_telephone_link ut ON us.UserID = ut.UserID
INNER JOIN telephone tl ON ut.telephoneID = tl.telephoneID
WHERE us.UserID = (
SELECT MAX(UserID)
FROM users
) AND tl.telephone LIKE '%". $search ."%'
ORDER BY us.USERID DESC;
Et là, le temps de réponse devrait descendre largement en dessous du seuil d'une seconde...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse 