Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/07/2011, 10h45   #1
Débutant
 
Inscription : avril 2005
Messages : 464
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 464
Points : 69
Points : 69
Par défaut Utiliser 'Like' ou une jointure ?

Bonjour,

J'ai deux tables Operations et Comptes. Toutes les opérations de Comptes sont faites dans la table Operations. Elles sont liées par une colonne Num_compte.

Je dois chercher des comptes dans la table Operations identifiés par un commencement de chiffre ou par leur nature se trouvant dans la table compte.
Ma question est de savoir si je dois utiliser un opérateur 'Like' avec un Select uniquement dans la table Operations ou si je dois faire une jointure avec les deux et d'avoir une condition additionnelle (Compte.nauture='valeur').

Sachant que tous les comptes commençant par 6 sont des comptes de nature 'charges'. Je veux ramasser tous les comptes dans la table Operations.

Quelle est la requête la plus sure ?

Code :
SELECT num_compte,montant FROM Operations WHERE num_compte LIKE '6%'.
ou

Code :
1
2
SELECT num_compte, montant FROM Operations , Comptes WHERE 
Operations.num_compte=Comptes.num_compte AND Comptes.nature='charges'.
Merci de votre aide !

Cordialement
madina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 11h13   #2
Membre confirmé
 
Avatar de GyZmoO
 
Homme Mickaël
Ingénieur développement logiciels
Inscription : février 2006
Messages : 402
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Âge : 27
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : février 2006
Messages : 402
Points : 238
Points : 238
Envoyer un message via MSN à GyZmoO
Bonjour.

Solution 2) avec jointure :

- Certainement + efficace que celle avec Like
- Plus compréhensible si un jour qq'un doit reprendre cette requête (bah le like "6%" c'est pas forcément clair !)

Au passage, mieux vaut écrire les jointures de manière standard :

Code :
1
2
3
4
5
 
SELECT c.num_compte, o.montant 
FROM Operations o 
INNER JOIN Comptes c ON c.num_compte = o.num_compte
WHERE c.nature = 'charges'
à la place de

Code :
1
2
3
 
SELECT num_compte, montant FROM Operations , Comptes WHERE 
Operations.num_compte=Comptes.num_compte AND Comptes.nature='charges'.
cela permet de mieux différencier le critère de jointure (ON) et le filtre de recherche (WHERE)

@+
__________________
define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.
GyZmoO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 11h23   #3
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Qu'entends-tu par la plus sûre ?
Si la nomenclature comptable est respectée tous les comptes de charge ont un code d'imputation qui commence par 6, effectivement.
Mais j'ai vu des comptabilités où les codes des comptes étaient préfixés d'une lettre censée représenter une filiale ou un budget annexe.
Maintenant est-ce que LIKE '6%' sera plus rapide qu'une jointure, tout dépend si les colonnes c.num_compte, o.num_compte et c.nature sont indexées.
Pour la syntaxe de la jointure, si je suis d'accord avec GyZmoO, dans l'absolu, dans le cas précis, je crains que de déporter le filtre sur 'charges' dans la clause WHERE ne soit pas trop rentable en termes de performances.
En effet, il vaut mieux ne faire la jointure que sur les lignes utiles de la table comptes.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 11h41   #4
Débutant
 
Inscription : avril 2005
Messages : 464
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 464
Points : 69
Points : 69
Bonjour Gymo,

Je vois la solution. merci.

mais pour la jointure j’espère que je serais certain d'avoir tous les comptes 'charges' se trouvant dans la table 'Operations'. Car ce sont ceux-là qui m’intéressent .
Car il y en a quelques-uns qui se trouvent dans la table Comptes et n’étant pas dans Operations.

Maljuna ,
En fait , j'entends par la plus sure la plus rapide et la plus fiable pour être sûr d'avoir tous les comptes 'charges' se trouvant dans Operations . Bon à vrai dire je n'ai encore indexé aucune colonne. mais je pense bien le faire après.
madina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 12h48   #5
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
GyZmoO vous a donné les bonnes clés pour votre problème.
Le fait aussi de passer par la jointure vous permettra aussi de gérer plus facilement vos évolutions fonctionnelles (imaginez qu'un compte charge commence par un autre chiffre que 6 dans le futur)

En ce qui concerne la remarque de Maljuna Kris, il faudra passer par un plan d’exécution pour voir la différence (je pense qu'il sera identique, mais ça peut être enrichissant de faire le test). J'aurais plutôt tendance à différencier le côté relationnel et le métier (ne serait-ce que pour des évolutions d’écriture de votre requête, si des contraintes métiers devaient se surcharger dans le futur)...

Mais là c'est à vous de choisir

bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 11h24   #6
Débutant
 
Inscription : avril 2005
Messages : 464
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 464
Points : 69
Points : 69
Bonjour Yanika.

Je vois bien. Merci pour les éclaircissements apportés.
Je pense que la jointure est plus appropriée.
Et à bientôt certainement pour d'autres types de questions sur lesquelles je serai appelé à vous interpeller.

Cordialement.
madina est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h45.


 
 
 
 
Partenaires

Hébergement Web