[MySQL] requête difficile !!!

boob
Invité n'ayant pas de compte PHPfrance

26 juil. 2006, 18:29

Bonjour a tous,

Voila mon problème : J'ai recement installé un utilitaire de gestion de park informatique. Cet utilitaire est gratuit, de plus il stock les données (les caracteristique des PC, des imprimantes, des switch etc...) dans une base en MySQL. De plus il est vraiment très bien fait !!! inf-berg pour ceux que ca interesse! (open source) \o/

Dans une table j'ai le nom du PC ainsi que les application qui sont installées dessus (celles que l'on retrouve dans ajout/suppression de programme dans le panneau de configuration de windows).

A partir de cette table je peut voir par exemple tous les PC qui on office 2000 , cela me permet de pouvoir mettre a jour les quelques utilisateurs tournant sur une "vieille" version de office.

Je peus aussi voir quel utilisateurs on installé winamp par exemple ^^.

Maintenant ce que je desire c'est de pouvoir voir les utilisateurs qui NE POSSEDE PAS certains logiciels indispensables comme l'antivirus par exemple...

La difficulté réside dans le faite que si je fait une recherche de logiciels installés sur le même ordinateur et que je cherche le logiciel en question (l'antivirus toujours par exemple ;) ), si je ne le trouve pas je dit qu'il m'affiche le nom du PC.

En programmation ca à l'air dêtre facile ca doit ressembler a quelque chose comme ca :


Pour chaque ordinateurs :
|-----Pour chaque logiciels :
|----------Si le nom du logiciel correspond à celui de l'antivirus :
|---------------Alors j'affiche son nom
|----------Sinon :
|---------------Je passe a l'ordinateur suivant

proteus2k7
Invité n'ayant pas de compte PHPfrance

26 juil. 2006, 19:09

Moi je ferais bien quelque chose comme ça, en admettant que ta table s'appelle "matable", et que les champs soient "nomOrdi" et "logiciel":

Code : Tout sélectionner

SELECT nomOrdi FROM matable WHERE nomOrdi NOT IN (SELECT nomOrdi WHERE logiciel = 'antivirus');

boob
Invité n'ayant pas de compte PHPfrance

27 juil. 2006, 13:56

Re,
J'ai essayer cela :

Code : Tout sélectionner

SQL: SELECT `UC_NOM` FROM `software` WHERE `UC_NOM` NOT IN (SELECT `UC_NOM` WHERE `Caption` == 'CA eTrust Antivirus Version: 7.1.0194' )
Mais MySQL me retourne une erreur !!! de type :

1064 - Erreur de syntaxe près de 'WHERE `Caption` == 'CA eTrust Antivirus Version: 7.1.0194' )' ?a ligne 5

Je ne sais pas pourquoi !!!

PS même avec

Code : Tout sélectionner

SQL: SELECT `UC_NOM` FROM `software` WHERE `UC_NOM` NOT IN (SELECT `UC_NOM` WHERE `Caption` = 'CA eTrust Antivirus Version: 7.1.0194' )

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

27 juil. 2006, 13:58

Quelle est la version de MySQL utilisée ? les sous-requêtes sont disponibles à part de la 4.1

Toujours préciser d'entrée la version utilisée quand on poste un message !

boob
Invité n'ayant pas de compte PHPfrance

27 juil. 2006, 14:11

dsl de l'oubli, j'ai Easy PHP 1.8. Ma version de MySQL est MySQL 4.1.9!

Merci

Eléphanteau du PHP | 38 Messages

27 juil. 2006, 14:13

dans la sous requête, tu as oublié de spécifié le FROM, et le "==" n'existe pas en mysql, c'est =

boob
Invité n'ayant pas de compte PHPfrance

27 juil. 2006, 14:26

OK, la requete marche bien, merci beaucoup, en revanche le resultat n'est pas celui que j'attendais...

dans ma table software j'ai UC_nom et caption ou UC_nom représente le nom de l'ordinateur et caption le nom du logiciel.

Je souhaite avoir les ordinateur qui n'on pas un certain logiciel installé comme l'antivirus ou vnc par exemple.

boob
Invité n'ayant pas de compte PHPfrance

28 juil. 2006, 17:27

Dsl, je m'explique mal...

Au debut j'execute une requete qui me montre tous les postes ou winamp est installé, par exemple.

Comme resultat j'ai 4 ou 5 PC qui s'affiche dans MySQL.

Dans ce cas, vu que winamp ne doit pas etre installé ceci est pratique pour pouvoir les desintallés.
Or quand il s'agit d'installer une application présente sur 95% des postes ca devient plus compliqué, et il serait préférable de n'afficher que les postes ou cette application n'est pas installé.

Code : Tout sélectionner

SELECT `UC_NOM` FROM `software` WHERE `UC_NOM` NOT IN (SELECT `UC_NOM` FROM `software` WHERE `Caption` = 'CA eTrust%' )
Ce code me retourne plein de fois le nom de chaque PC. Je pense que ce "plein de fois" correspond au nombre d'application installés sur chaque PC.
Le plus etonnant est qu'il me retourne les noms des PC ou l'application est installée, or je souhaite voir le nom des PC ou l'application n'est pas installée!

Merci

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juil. 2006, 17:46

Ce code me retourne plein de fois le nom de chaque PC. Je pense que ce "plein de fois" correspond au nombre d'application installés sur chaque PC.
Oui, il renvoie chaque nom de poste qu'il trouve. Essaye avec DISTINCT.
Le plus etonnant est qu'il me retourne les noms des PC ou l'application est installée, or je souhaite voir le nom des PC ou l'application n'est pas installée!
C'est déjà moins normal...

boob
Invité n'ayant pas de compte PHPfrance

31 juil. 2006, 09:00

Re

J'ai essayé avec distinct, effectivement cela m'affiche une fois chaque ordinateurs, mais j'ai toujours le même soucis : il m'affiche à chaque fois tout les ordinateurs.

Cela reste bizarre.

PS, voici ma requete :

Code : Tout sélectionner

SELECT DISTINCT `UC_NOM` FROM `software` WHERE `UC_NOM` NOT IN (SELECT `UC_NOM` FROM `software` WHERE `Caption` = 'CA eTrust%' )

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

31 juil. 2006, 10:22

As-tu déjà essayé cette requête seule :

Code : Tout sélectionner

SELECT `UC_NOM` FROM `software` WHERE `Caption` = 'CA eTrust%'
Pour voir si elle renvoie bien ce que tu veux

boob
Invité n'ayant pas de compte PHPfrance

31 juil. 2006, 11:29

Oui, je l'ai déjà essayé et elle me renvoie bien le nom des ordi ou CA etrust% est installé.

Merci

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

31 juil. 2006, 13:45

Qu'est-ce que cette ligne est sensée faire exactement ?

Code : Tout sélectionner

`Caption` = 'CA eTrust%'
Si tu veux obtenir le nom des ordinateurs possédant un logiciel dont le nom commence par "CA eTrust" alors il faut utiliser l'opérateur LIKE, et non une simple égalité.

Ton problème vient du fait que tu utilises la table "software" pour obtenir la liste de tes ordinateurs, alors qu'en théorie tu devrais avoir une table "computers" (ou autre) qui les recense. Selon ta version de MySQL, tu peux la créer comme suit:

Code : Tout sélectionner

CREATE TABLE computers SELECT DISTINCT UC_NOM FROM software
N'oublie pas de déclarer "UC_NOM" comme clé primaire.

Une fois la liste des PCs établies, il est plus facile d'obtenir ceux qui ne possèdent pas un certain logiciel. Pour le faire, on part de la liste complète des PC (dans "computers", alias "c") on fait une jointure vers la table "software" (alias "s") pour chercher le logiciel en question sur chaque ordinateur et on ne garde que ceux qui n'ont pas d'enregistrement correspondant (autrement dit, "s.UC_NOM = NULL")

Code : Tout sélectionner

SELECT c.UC_NOM FROM computers c LEFT JOIN software s ON s.UC_NOM = c.UC_NOM AND Caption LIKE 'CA eTrust%' WHERE s.UC_NOM IS NULL

boob
Invité n'ayant pas de compte PHPfrance

31 juil. 2006, 14:26

Alors la je dit respect, M. le Baron.

Comme vous avez pu le constater d'apres la phrase ci dessus ca marche!!!

Je vous remercie tous de vous etre impliqué dans mon problème !!!

Un grand merci à PHPfrance

Post résolu :D