2010-10-02 1 views
1

Ma requête est terriblement grand:Est-ce que je rejoins ces 4 tables correctement?

SELECT n1.*, n2.rating, n3.*, n4.* 
FROM stats n1 
INNER JOIN members n2 
ON n1.n_id = n2.id 
INNER JOIN add_info n3 
ON n1.n_id = n3.n_id 
INNER JOIN other_table n4 
ON n1.code = n4.code 
WHERE n1.n_id = {$member_id} AND n1.code='{$some_code}' 

Suis-je faire cela correctement? Si oui, puis-je le faire mieux, plus optimal? Parce que j'ai vraiment besoin d'informations sur chacune des 4 tables.

Merci.

+2

Votre requête n'est pas ** que ** mauvaise. Ça pourrait être un peu gros, mais j'ai vu des requêtes bien pires que ça. –

+2

La requête n'est certainement pas très grande, elle est en fait assez petite (les requêtes complexes peuvent avoir 100 lignes et plus). Quant à "l'améliorer": Pourquoi ressentez-vous que ce n'est pas bon? Qu'aimeriez-vous faire mieux? Il semble bien comme posté. – sleske

Répondre

2

Honnêtement, cela ne semble pas trop mauvais.

Lorsque vous posez des questions sur l'optimisation, gardez à l'esprit que vous pouvez optimiser le code pour différents objectifs. Par exemple, vous pouvez optimiser les performances: vous souhaitez que le code atteigne son objectif le plus rapidement possible. Vous pouvez également optimiser pour le code qui est facile à lire. Vous pouvez optimiser pour la maintenabilité ou la testabilité. Dans le monde réel, vous équilibrez habituellement chacun de ces objectifs pour réaliser quelque chose de approprié à la situation.

Si vous vous joignez souvent à toutes ces tables, pensez à utiliser un view pour faciliter l'écriture, la lecture et la maintenance des requêtes individuelles.

2

Ce n'est pas si difficile d'obtenir des données des quatre tables. Assurez-vous que vous avez indexes sur vos clés de jointure et envisagez d'utiliser prepared statements à la fois pour améliorer les performances et empêcher l'injection SQL.

Vous pouvez utiliser des sous-requêtes dans la clause SELECT, mais je doute que cela améliore les performances.

2

Cette requête semble assez OK. Vous voudrez peut-être voir si vous pouvez restreindre un peu votre liste de sélection, nommant explicitement les colonnes au lieu de simplement demander n1. *, N3. * Et n4. *.

Combien de temps dure votre requête? Si vous n'êtes pas satisfait des performances, vérifiez les indices sur vos jointures.

Questions connexes