Page 1 sur 1

Besoin de précision sur JOIN

Posté : 22 avr. 2008, 10:41
par toony.m
Bonjour à tous,

J'ai 2 tables sous mySQL: xtra_entreprise (5000 lignes) & xtra_employes (17500 lignes).

Par le biais d'un JOIN, j'essaye d'afficher toutes les entreprises qui correspondent à un critère avec leur employés associés. Je fais :

Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 2.8.1 -- http://www.phpmyadmin.net -- -- Structure de la table `xtra_entreprise` -- CREATE TABLE `xtra_entreprise` ( `id_entreprise` int(11) NOT NULL auto_increment, `nom_entreprise` varchar(255) default NULL, `departement` varchar(40) default NULL, `cibler_pour` text, `ne_pas_cibler_pour` text, `identifie` text, PRIMARY KEY (`id_entreprise`) ); CREATE TABLE `xtra_employes` ( `id_employes` int(11) NOT NULL auto_increment, `id_entreprise` int(11) default NULL, `C_nom_prenom` varchar(255) default NULL, `codification_fonction` text, PRIMARY KEY (`id_employes`) ) select xtra_entreprise.nom_entreprise, xtra_entreprise.id_entreprise, xtra_entreprise.departement, xtra_entreprise.cibler_pour, xtra_entreprise.ne_pas_cibler_pour, xtra_entreprise.identifie, xtra_employes.id_employes, xtra_employes.C_nom_prenom, xtra_employes.C_codification_metier from xtra_employes left outer join xtra_entreprise on xtra_entreprise.id_entreprise = xtra_employes.id_entreprise ORDER BY departement ASC, nom_entreprise ASC
Cette requete met 0.1s à s'executer mais les entreprises qui n'ont pas d'employés ne sont pas affichées.
Si je fais l'inverse avec un right JOIN, la requete met 15s a s'executer!!!

Ce que je ne comprends pas c'est qu'il est plus rapide d'afficher tous les profils qui ont une société plutot que toutes les sociétés qui ont des profils alors qu'il y en a 3 fois moins...

Est-il possible de modifier cela pour qu'en une seule requete, je puisse avoir la liste des entreprises voulues avec le total des employés correspondants a certains critères (avec un COUNT ?) ?

j'espère avoir été assez clair... :roll:

Posté : 22 avr. 2008, 12:54
par ouckileou
Il y a un WHERE qui ne sert à rien dans ta requête.

Utilise la commande EXPLAIN pour savoir comment sont exécutées les requêtes, ça pourra t'aider : http://dev.mysql.com/doc/refman/5.0/en/explain.html

Posté : 22 avr. 2008, 13:56
par toony.m
Le where etait une erreur de frappe. Je l'ai enlevé.:oops:

J'ai rajouté explain devant ma requete et j'avoue que cela ne m'aide pas beaucoup plus.

Ma seule question en fait est:
Est-il possible d'avoir la liste des entreprises concordante avec une condition (where departement='75' par ex.) ainsi que la sommes des employés de l'entreprise avec une condition également (C_codification_metier="23;" par exemple) mais d'une autre table, et ce, ligne par ligne.

Parce que pour l'instant, je suis obligé de faire la requete de 15s avec tous les détails et de gérer via mon langage de programmation (php) toutes ces lignes pour ne totaliser que ce qui m'intéresse.

Et je me demande comment faire ça en une seule requête! Déja est-ce que c'est possible avec mySQL... :?:

Posté : 22 avr. 2008, 14:07
par ouckileou
Tu prends la requête de ton premier post, tu fais un COUNT() sur id_employe et un GROUP BY id_entreprise par exemple, ça devrait fonctionner.

J'avoue que je suis surpris que tu me dises que les entreprises sans employés ne soient pas renvoyées car c'est justement le principe de la jointure externe.

Posté : 22 avr. 2008, 15:16
par toony.m
Désolé mais je vois pas comment faire.. :oops:
Je dois être trop bête..............

je réussi à trouver déja le nombre d'employé correspondant à ce que je recherche avec cette requete:

Code : Tout sélectionner

select id_entreprise, count(id_employe) AS total from xtra_profil where id_entreprise in (SELECT nom_entreprise, id_entreprise, departement FROM xtra_entreprise WHERE statut='ok' ORDER BY departement ASC, nom_entreprise ASC) group by id_entreprise
Cela me donne 2 colonnes de résultat:
id_entreprise | total
1 12
15 4
...


Et je trouve les entreprises que je souhaite avec :

Code : Tout sélectionner

select nom_entreprise, id_entreprise, departement FROM xtra_entreprise WHERE statut='ok' ORDER BY departement ASC, nom_entreprise ASC
Mais comment relier ces 2 tableaux en 1 seul :?: :?: :?: :?:

Help please!!

Posté : 23 avr. 2008, 14:28
par toony.m
personne ?

:cry:

Posté : 23 avr. 2008, 15:58
par ouckileou
À vue de nez un truc comme ça, la jointure externe te permettant normalement d'éviter une sous-requête :

Code : Tout sélectionner

SELECT ent.nom_entreprise, ent.id_entreprise, ent.departement, ent.cibler_pour, ent.ne_pas_cibler_pour, ent.identifie, COUNT(xtra_employes.id_employe) AS total FROM xtra_entreprise AS ent LEFT OUTER JOIN xtra_employes AS emp ON ent.id_entreprise = emp.id_entreprise WHERE ent.statut='ok' GROUP BY ent.id_entreprise ORDER BY ent.departement ASC, ent.nom_entreprise ASC