Besoin de précision sur JOIN

Eléphant du PHP | 115 Messages

22 avr. 2008, 10:41

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:
Modifié en dernier par toony.m le 22 avr. 2008, 13:57, modifié 1 fois.
Quelques réalisations www.cdi-interactiv.com

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

22 avr. 2008, 12:54

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

Eléphant du PHP | 115 Messages

22 avr. 2008, 13:56

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... :?:
Quelques réalisations www.cdi-interactiv.com

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

22 avr. 2008, 14:07

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.

Eléphant du PHP | 115 Messages

22 avr. 2008, 15:16

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!!
Quelques réalisations www.cdi-interactiv.com

Eléphant du PHP | 115 Messages

23 avr. 2008, 14:28

personne ?

:cry:
Quelques réalisations www.cdi-interactiv.com

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

23 avr. 2008, 15:58

À 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