1 requete SQL avec deux Requete Distincte

1 requete SQL avec deux Requete Distincte - SQL/NoSQL - Programmation

Marsh Posté le 06-07-2011 à 13:39:58    

Bonjour,
 
Présentation du contexte:
 
J'ai une seule TABLE du nom de JOURNAL
Les champs sont: USERNAME, COMPUTERNAME, IP, LOGON et LOGOFF
Je travail avec MySQL en ligne de commande sous windows avec WAMPSERVER.
 
Je souhaite en faite:
- Calculer le nombre de connexion effectuer par machine: sachant qu'une entrée dans la base correspond a une connexion.
 
SELECT Computername, COUNT(*) AS Nb_connexion FROM journal GROUP BY Computername;
 
j'obtient: (valeur fictive)
 
#-----------------------#------------------------#
|       Computername       |          Nb_connexion     |
#-----------------------#------------------------#
|       Machine 1             |                 123            |
|       Machine 2             |                 234            |
|       Machine 3             |                 345            |
#-----------------------#------------------------#
 
Et je souhaite également compter le nombre de machine qui ne sont pas parvenue a se deconnecter correctement.
Je l'identifie grace a un marqueur 'N/A' qui correspond a Not Avable soit non disponible. Sinon c'est une date au format AAAA/MM/JJ - hh:mm:ss:mmm
 
La requete est simple:
 
SELECT Computername, COUNT(Logoff) AS Nb_bug FROM journal WHERE Logoff='N/A' GROUP BY Computername;
 
j'obtient: (valeur fictive)
 
#-----------------------#------------------------#
|       Computername       |          Nb_bug              |
#-----------------------#------------------------#
|       Machine 1             |                 1               |
|       Machine 2             |                 2               |
|       Machine 3             |                 3               |
#-----------------------#------------------------#
 
Miantenant,n et c'est la ou je n'arrive pas a écrire la requete:
Je souhaite avoir un tableau qui se présente sous la forme:
 
#-----------------------#------------------------#---------------------#
|       Computername       |          Nb_bug              |    Nb_connexion        |
#-----------------------#------------------------#---------------------#
|       Machine 1             |                 1               |             123             |
|       Machine 2             |                 2               |             234             |
|       Machine 3             |                 3               |             345             |
#-----------------------#------------------------#---------------------#
 
J'ai tenter:
 
SELECT Computername, COUNT(*) AS Nb_connexion FROM journal GROUP BY Computername
UNION
SELECT Computername, COUNT(Logoff) AS Nb_bug FROM journal WHERE Logoff='N/A' GROUP BY Computername;
 
 
J'obtient :
#-----------------------#------------------------#
|       Computername       |          Nb_bug              |
#-----------------------#------------------------#
|       Machine 1             |                   1             |
|       Machine 2             |                   2             |
|       Machine 3             |                   3             |
|       Machine 1             |                 123            |
|       Machine 2             |                 234            |
|       Machine 3             |                 345            |
#-----------------------#------------------------#
 
j'ai tenté d'autre truc mais j'obtient les meme compte pour les bug et le nombre de connexion.
 
je souhaite avoir le nombre de bug et le nombre de connexion afin d'en faire des statistiques.
Par exemple un pc qui a bugé 10 fois pour 100 connexion (taux= 10% de bug) est plus "performant" qu'un pc qui a bugé 10 fois pour 50 connexion (taux=50% de bug).
 
avez vous des idées???
 
je n'y arrive pas...
 
Au pire des cas je pense etre capable de le faire en PHP mais c'est un programme, plus une requete.
 
Merci bcp pour votre aide


Message édité par neo-blaster le 06-07-2011 à 14:09:20
Reply

Marsh Posté le 06-07-2011 à 13:39:58   

Reply

Marsh Posté le 06-07-2011 à 14:11:03    

je peux pas regrouper le tout dans un SELECT car la clause WHErE sera appliquer a mes deux attribut alors que les conditions sont diférente.

Reply

Marsh Posté le 06-07-2011 à 17:51:53    

Spa un join qu'il te faut tout simplement?

select a.Computername, a.Nb_connexion, b.Nb_bug
from (SELECT Computername, COUNT(*) AS Nb_connexion FROM journal GROUP BY Computername) a
left outer join (SELECT Computername, COUNT(Logoff) AS Nb_bug FROM journal WHERE Logoff='N/A' GROUP BY Computername) b on a.Computername = b.Computername;


Edit: connais pas la syntaxe MySQL mais bon tu vois l'idée


Message édité par lasnoufle le 06-07-2011 à 17:54:25

---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 06-07-2011 à 20:33:15    

je vais essayer je vous tien au courant, je ne suis pas au boulot pour le moment ^^

Reply

Marsh Posté le 07-07-2011 à 08:12:56    

Excellent, ça marche !!!
Impressionnant !!Merci beacoup Lasnoufle.
Je voulais juste te demander quelque explication sur 'LEFT OUTER JOIN' afin de mieux comprendre son fonctionnement !!
A la fin on a ON a.Computername = b.Computername. Ce sont les conditions de l'union?
Re merci !

Reply

Marsh Posté le 19-07-2011 à 13:20:04    

neo-blaster a écrit :

Excellent, ça marche !!!
Impressionnant !!Merci beacoup Lasnoufle.
Je voulais juste te demander quelque explication sur 'LEFT OUTER JOIN' afin de mieux comprendre son fonctionnement !!
A la fin on a ON a.Computername = b.Computername. Ce sont les conditions de l'union?
Re merci !


Oups pardon j'étais plus là. Y a rien d'impressionnant c'est du SQL de base... Tu dois pouvoir trouver facilement des cours ou de la doc SQL en ligne si ca t'intéresse.
Oui le ON donne les conditions de l'union.
LEFT OUTER JOIN c'est pour ne pas éliminer les lignes qui ne matcheraient pas la condition: si tu mets juste JOIN et que tu as un computername dans "a" qui n'existe pas dans "b", ben ce computername sera "éliminé" dans le join parce que non matché dans "b".
Si tu mets LEFT OUTER JOIN (me souviens meme plus si LEFT et OUTER sont vraiment tous les deux utiles, p'tetre qu'un seul suffirait), le computername sera toujours présent dans le résultat, avec des valeurs nulles pour les champs qu'il "aurait du" récupérer de "b".


---------------
C'était vraiment très intéressant.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed