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 08/12/2011, 15h46   #1
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
Par défaut [MySQL] Requête group by optimisable?

Bonjour à tous !!

Je viens d'écrire une requête, qui fonctionne correctement (i.e, elle me renvoie bien les lignes attendues), houra !

Mais je me demandais, par simple curiosité, si c'est la meilleure façon de faire, et sinon, comment feriez vous??

Allez, maintenant, je présente les choses :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
TABLE 
T_CAL
( 
CAL_ID SMALLINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
CALTYP_ID  SMALLINT NOT NULL REFERENCES T_CAL_TYPE(CALTYP_ID), 
RF_ID SMALLINT NULL,
CHAIN_ID SMALLINT NULL
);
 
 
T_CAL_TYPE
(
CALTYP_ID SMALLINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
CALTYP_NAME VARCHAR(40) NOT NULL
)
 
 
Y'a d'autres colonnes sur ces 2 TABLES, mais ON s'en tamponne :)
Le but de la requête : pour chaque groupe (RF_ID, CHAIN_ID) de la table T_CAL (ainsi que pour un autre filtre dans le WHERE), je veux conserver uniquement les CAL_ID de telle sorte que ces CAL_ID ne soit pas le minimum pour ce groupe (RF_ID, CHAIN_ID) là.

Exemple (des lignes de la table T_CAL):
Citation:
1 - 1 - 2
2 - 1 - 1
3 - 1 - 2
4 - 1 - 2
5 - 1 - 1
Le résultat que j'attends :

Citation:
3 - 1 - 2
4 - 1 - 2
5 - 1 - 1
Maintenant voici ma requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
SELECT cal1.cal_id FROM t_cal cal1
INNER JOIN t_cal_type ty ON ty.caltyp_id = cal1.caltyp_id
LEFT OUTER JOIN
 
(SELECT min(cal.cal_id) AS minB FROM t_cal cal
INNER JOIN t_cal_type type1 ON type1.caltyp_id = cal.caltyp_id
WHERE type1.CALTYP_NAME='RCHAIN'
GROUP BY cal.rf_id, cal.chain_id) AS te
 
ON minB = cal1.cal_id
WHERE ty.caltyp_name='RCHAIN'
AND minB IS NULL
Cette requête fait bien ce que j'attends, mais est ce qu'il y'a plus simple? plus optimisé? Comment auriez vous fait?

D'avance, je vous dis bien merci ! !

Mickaël.
__________________
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 08/12/2011, 16h22   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
À première vue, et indentation du code mise à part, ça me semble pas mal du tout !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 16h58   #3
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
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 531
Points : 3 524
Points : 3 524
Saluton,
Dommage de passer par CALTYP_NAME='RCHAIN' pour filtrer plutôt que par CALTYP_ID qui est indexée.
__________________
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 09/12/2011, 07h39   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Faut voir, une table de type est logiquement une très petite table, du coup un index sur la colonne de code ne va pas forcément être utilisé (je ne parle pas de la pk)
Du coup la perte de temps devrait être minime (en gros 1-2 accès disque)
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 09h38   #5
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, et merci à vous 3 !

Effectivement, la table T_CALTYP est une "petite" table, 6~7 colonnes, avec au max 40 lignes.

Mais, cela dit, je ne comprend pas trop :
Citation:
"Dommage de passer par CALTYP_NAME='RCHAIN' pour filtrer plutôt que par CALTYP_ID qui est indexée."
Comment faire autrement??
__________________
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 09/12/2011, 09h51   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
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 531
Points : 3 524
Points : 3 524
Et bien j'imagine que la requête est construite, disons dynamiquement, et que tant qu'à faire si on sélectionne 'RCHAIN' dans une liste déroulante, s'arranger pour que la value associée à l'<option> soit celle de caltyp_id plutôt que celle de CALTYP_NAME.
__________________
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 09/12/2011, 11h07   #7
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
Ah ok !
Oui effectivement, c'est envisageable
__________________
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 09/12/2011, 12h18   #8
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
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 531
Points : 3 524
Points : 3 524
Du coup, tu optimises ta requête (et ta sous-requête) puisque tu n'as plus besoin des jointures.
Optimiser c'était bien l'objectif visé au départ, non ?
__________________
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 09/12/2011, 15h42   #9
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
C'est pas faux !

Merci pour toutes vos remarques !

Je tag [résolu]
__________________
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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h02.


 
 
 
 
Partenaires

Hébergement Web