Besoin de précision sur JOIN

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Besoin de précision sur JOIN

par ouckileou » 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

par toony.m » 23 avr. 2008, 14:28

personne ?

:cry:

par toony.m » 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!!

par ouckileou » 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.

par toony.m » 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... :?:

par ouckileou » 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

Besoin de précision sur JOIN

par toony.m » 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: