Requête SQL

Elodette -  
 Elodette -
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

  1. NookZ Messages postés 2376 Statut Membre 514
     
    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
    1. Elodette
       
      Si j'ai bien compris "ISNULL", il faut que je le fasse pour tous les champs?
      0
  2. Elodette
     
    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
  3. niahoo Messages postés 262 Statut Membre 19
     
    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
    1. Elodette
       
      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
  4. niahoo Messages postés 262 Statut Membre 19
     
    dans le second cas ce que je te propose est quand même possible .
    0
    1. Elodette
       
      Une seule table logiciel qui référence le service avec une clé étrangère. ^^
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. niahoo Messages postés 262 Statut Membre 19
     
    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
    1. Elodette
       
      Oui c'est vrai, mais comment ferai tu pour ces fameuses boucles?
      0
      1. Elodette > Elodette
         
        Personne pour m'aider? =(
        0
  7. niahoo Messages postés 262 Statut Membre 19
     
    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
    1. Elodette
       
      Oui je vais tenté merci!
      Ca sera plus joli comme tu dis ^^
      0
  8. niahoo Messages postés 262 Statut Membre 19
     
    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
    1. Elodette
       
      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