Requête SQL

Fermé
Elodette - 12 févr. 2009 à 12:20
 Elodette - 12 févr. 2009 à 17:46
Bonjour,

J'ai une requête qui affiche logiquement ce qu'elle doit afficher ^^ mais je voudrais la modifier pour avoir ce que je souhaite!

En effet, la requête renvoie les résultats, mais que si la table est rempli, hors je voudrais que même si la table est vide, un résultat s'affiche.
Les tables sont constitués ainsi :

service => logiciel => machine => machine_robot => robot
--------- => imprimante
------------------------------------------ =>peripherique

J'ai essayé de schématiser au mieux les tables, les "=>" représentant les liens!

Pour le moment,la requête n'affiche QUE les résultats qui ont tout rempli, c'est à dire les 7 tables. Et je voudrais que par exemple, la table service s'affiche, même si le reste des tables est vide!

Voici maintenant la requête, attention ne partez pas en courant ^^ :

SELECT service.nom AS NomService,
service.ChefDeService,
service.tel,

logiciel.nom AS NomLogiciel,
logiciel.version,

machine.marque AS MarqueMach,
machine.modele AS ModeleMach,
machine.marqueProcesseur,
machine.modeleProcesseur,
machine.RAM,
machine.HDD,
machine.OS,
machine.numeroDeSerie AS NDSMach,
machine.dateDeMAJ,
machine.machineNonMS,
machine.commentaire,

imprimante.marque AS MarqueImpr,
imprimante.modele AS ModeleImpr,
imprimante.numeroDeSerie AS NDSImpr,

robot.marque AS MarqueRob,
robot.modele AS ModeleRob,
robot.numeroDeSerie AS NDSRob,

peripherique.type,
peripherique.marque AS MarquePeriph,
peripherique.modele AS ModelePeriph,
peripherique.numeroDeSerie AS NDSPeriph,
peripherique.description

FROM service,

logiciel,

machine,

imprimante,

machine_robot,
robot,

peripherique

WHERE idSite='$idSite'

AND service.idService = logiciel.idService

AND logiciel.idMachine = machine.idMachine

AND service.idService = imprimante.idService

AND machine.idMachine = machine_robot.idMachine
AND machine_robot.idRobot = robot.idRobot

AND machine.idMachine = peripherique.idMachine

7 réponses

NookZ Messages postés 2138 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 7 mars 2013 514
12 févr. 2009 à 12:24
Votre clause WHERE exprime bien qu'il faut que toutes les conditions soient remplies pour obtenir un résultat, c'est donc elle que vous devez modifier.

Si vous avez des champs à NULL et que cela engage des erreurs, vous pouvez utiliser ceci :
https://docs.microsoft.com/fr-fr/sql/t-sql/functions/isnull-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15
0
Si j'ai bien compris "ISNULL", il faut que je le fasse pour tous les champs?
0
En fait j'ai peut être mal expliqué.

Voilà, alors en fait, la table robot ne peut pas exister si la table machine_robot n'existe pas, la table machine n'existe pas si logiciel n'existe pas, et ainsi de suite...

service => logiciel => machine => machine_robot => robot
--------- => imprimante
------------------------------------------ =>peripherique

Seulement, je voudrais afficher la table service, même si les autres tables n'existent pas pour le service en question, ou alors afficher les tables service et logiciel, même si les tables suivantes n'existent pas.
0
niahoo Messages postés 247 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 23 mai 2010 19
12 févr. 2009 à 12:48
ben tout dépends de ce que tu compte faire comme programme aussi.

si tu veux afficher différents éléments, tu pourrais fair ça:

afficher les services
pour chaque service, affficher les logiciels
pour chaque logiciel, afficher les machines
etc...


bon certes au lieu de faire une seule requête ça en fait plsusieurs, mais ça devient très modulable.


et ça peut te renvoyer un tableau comme ça
service1
|--logicielA
|--logicielB
|  |--machine11
service2
service3
|--logiciel34
|  |--machinepouic
|  |  |--Robogrillepain
|  |--machinekikoo
|  |  |--RoboNono



par contre j'ai une question,

tu as plusieurs tables 'logiciels': une par service, ou alors tu as une seule table logiciel qui référence le service avec une clé étrangère.
0
Oui c'est comme cela que je souhaite faire avec une espèce d'arborescence.
Cependant j'ai pensé qu'une seule requête serait plus simple, car je n'aurai plus qu'à afficher les résultats de la requête, et ce de la manière dont je souhaite? Sinon il faudrait que je fasse plein de boucle de partout, un grand bazar quoi :s
0
niahoo Messages postés 247 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 23 mai 2010 19
12 févr. 2009 à 12:53
dans le second cas ce que je te propose est quand même possible .
0
Une seule table logiciel qui référence le service avec une clé étrangère. ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
niahoo Messages postés 247 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 23 mai 2010 19
12 févr. 2009 à 13:04
parfait , ben moi je serais toi j'irais me taper les boucles, certes c'est long, mais ça t'évitera d'avoir un tableau avec pelin de cases vides, ou au contraire plein de cases avec le même nom de service qui se répète en début de ligne pour chaque différent robot a droite de la ligne..
0
Oui c'est vrai, mais comment ferai tu pour ces fameuses boucles?
0
Elodette > Elodette
12 févr. 2009 à 17:36
Personne pour m'aider? =(
0
niahoo Messages postés 247 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 23 mai 2010 19
12 févr. 2009 à 17:41
ben
$sql="SELECT * FROM services";
$rs=mysql_query($sql, $ta_connection);

while($ligne=mysql_fetch_assoc($rs))
{

   // ici tu affiches les données du service

   $sql2="SELECT * FROM logiciels WHERE numéro_service ='"$ligne["numero_service"]."'";
   $rs2=$rs=mysql_query($sql2, $ta_connection);

   while($ligne2=mysql_fetch_assoc($rs2))
   {

       // ici tu affices les données du logiciel

      // et aisi de suit, ici select * from machines where numero_logiciel = $ligne2["numero_logiciel"]

   }
}
0
Oui je vais tenté merci!
Ca sera plus joli comme tu dis ^^
0
niahoo Messages postés 247 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 23 mai 2010 19
12 févr. 2009 à 17:44
voilà mais ça fait bcp de requetes donc ça va planter si t'as 10 000 services.


la solution qui marcherait avec ta requete serait d'utiliser LEFT JOIN mais je n'y connais pas passez, et je sais pas si mysql le comprend
0
Ba disons que c'est des services qui appartiennent à des clients, donc j'en aurais pas plus de 4-5 et encore, ça me semble déjà énorme 4-5 ^^
0