Requete sql selectionner données redondantes

Résolu
congela Messages postés 23 Statut Membre -  
congela Messages postés 23 Statut Membre -
Bonjour,



j'ai un petit problème!
j'ai trois tables liées entres elles, ca c'est ok.
le soucis:
je veux récupérer des données précises sur les tables...

en gros voilà, mes 3 tables:utilisateur, materiel, lien

2utilisateurs utilisent à un moment le même materiel, et je veux faire apparaitre ce materiel.
ma requette pour faire apparaitre tout le materiel d'un utilisateur c'est:

$query= mysql_query('SELECT nomproduit,quantite FROM lien LEFT OUTER JOIN materiel ON (lien.idmateriel=materiel.idmateriel) WHERE lien.login="'.$_SESSION["code"].'"');

où $_SESSION["code"] correspond au login de l'utilisateur connecté

si quelqu'un peut m'indiquer la requête sql à faire, merci d'avance!

11 réponses

  1. creadiff Messages postés 483 Statut Membre 57
     
    Petit conseil, utilise un nom de table un peu plus explicite que lien... par exemple materiel_utilisateur.

    Sinon, j'ai du mal à comprendre ce que tu cherches... la requête que tu utilises actuellement ne fonctionne pas ?
    0
  2. congela Messages postés 23 Statut Membre
     
    merci de t'intéresser à mon problème!
    donc j'ai:
    table utilisateur avec:
    *idutilisateur
    *login
    *mdp
    ltable materiel avec:
    *idmateriel
    *nomproduit
    *quantite
    utilisateur_materiel avec:
    *idutilisateur
    *idmateriel
    *login

    ma requete sql
    SELECT nomproduit,quantite 
    FROM utilisateur_materiel LEFT OUTER JOIN materiel ON (utilisateur_materiel.idmateriel=materiel.idmateriel) 
    WHERE utilisateur_materiel.login="'.$_SESSION["code"].'"
    


    cette requête fonctionne, mais je veux aller plus loin...
    par exemple dans ma table utilisateut_materiel:
    *idutilisateur:1 => idmateriel:4 =>login=nicolas
    *idutilisateur:2 => idmateriel:4 =>login=marion
    *idutilisateur:1 => idmateriel:5 =>login=nicolas
    *idutilisateur:2 => idmateriel:6 =>login=marion

    avec ma requête je peux faire apparaitre tout le matériel de nicolas ou de marion, mais moi je veux faire apparaitre leur matériel en commun ( donc idmateriel:4 )

    merci d'avance
    0
  3. Leviathan49 Messages postés 267 Statut Membre 70
     
    Je dirais
    SELECT nomproduit,quantite, COUNT(idutilisateur) AS nb_utilisateurs
    FROM utilisateur_materiel LEFT OUTER JOIN materiel ON (utilisateur_materiel.idmateriel=materiel.idmateriel) 
    GROUP BY nomproduit,quantite
    HAVING COUNT(idutilisateur)>1
    0
  4. congela Messages postés 23 Statut Membre
     
    merci beaucoup ça fonctionne!
    mais alors pour faire l'inverse et faire apparaitre que que le matériel différent...
    j'ai essayé:
    par exemple pour l'utilisateur1

    SELECT nomproduit,quantite, COUNT(idutilisateur) AS nb_utilisateurs
    FROM utilisateur_materiel LEFT OUTER JOIN materiel ON (utilisateur_materiel.idmateriel=materiel.idmateriel) 
    GROUP BY nomproduit,quantite
    HAVING COUNT(idutilisateur)=1
    WHERE utilisateur_materiel.idutilisateur=1


    mais ça ne marche pas...
    merci d'avance
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Leviathan49 Messages postés 267 Statut Membre 70
     
    Et comme ça ?
    SELECT nomproduit,quantite, COUNT(idutilisateur) AS nb_utilisateurs
    FROM utilisateur_materiel LEFT OUTER JOIN materiel ON (utilisateur_materiel.idmateriel=materiel.idmateriel) 
    WHERE utilisateur_materiel.idutilisateur=1
    GROUP BY nomproduit,quantite
    HAVING COUNT(idutilisateur)=1
    
    0
  7. congela Messages postés 23 Statut Membre
     
    la requête est correcte et fonctionne, malheureusement on retrouve le résultat du début, c'est à dire tout le matériel de idutilisateur1
    je cherche a avoir le matériel que seul l'idutilisateur1 possède
    en gros:
    materiel de idutilisateur1= materiel en commun(avec idutilisateur 2 et 3) + materiel personnel

    pour tout le materiel, ma requete est:
    SELECT materiel.nomproduit,materiel.quantite  
     FROM utilisateur_materiel LEFT OUTER JOIN materiel ON (utilisateur_materiel.idmateriel=materiel.idmateriel)   
    WHERE utilisateur_materiel.idutilisateur="'.$_SESSION["code"].'"


    pour le materiel en commun, ma requete est:
    SELECT nomproduit, quantite, COUNT(idutilisateur ) AS nb_utilisateurs  
     FROM utilisateur_materiel LEFT OUTER JOIN materiel ON (utilisateur_materiel.idmateriel = materiel.idmateriel )  
    GROUP BY nomproduit, quantite  
    HAVING COUNT( idtuilisateur )>1


    pour le matériel personnel, ma requête est:
    ....ça marche pas

    donc j'ai 2 problèmes:
    * faire apparaitre le matériel personnel propre à l'utilisateur connecté
    *la je pousse le vice...faire que l'on sache avec quel utilisateur on a du matériel en commun parce que idutilisateur1 peut en avoir en commun avec idutilisateur3 par exemple mais pas le même que avec idutilisateur4...

    merci d'avance de m'aider, parce que là moi je suis totalement bloquée!
    0
  8. Leviathan49 Messages postés 267 Statut Membre 70
     
    Ah je vois, dans ce cas, peut-être avec une requête imbriquée

    SELECT nomproduit,quantite  
    FROM utilisateur_materiel LEFT OUTER JOIN materiel ON (utilisateur_materiel.idmateriel=materiel.idmateriel)   
    WHERE utilisateur_materiel.idutilisateur=1 AND idmateriel IN (  
    SELECT idmateriel  
    FROM utilisateur_materiel   
    GROUP BY idmateriel    
    HAVING COUNT( idutilisateur )=1  
    )
    0
  9. congela Messages postés 23 Statut Membre
     
    j'aimerai dire que ca marche, malheureusement ce n'est pas le cas!
    0
    1. Leviathan49 Messages postés 267 Statut Membre 70
       
      Faudrait voir être plus précis que "ça marche pas"...
      Qu'est-ce qui ne va pas ? Erreur ? Mauvaise valeurs retournée ?

      Question qui a rien à voir : pourquoi est-ce qu'on retrouve le login dans la table de liaison ? C'est une clé primaire ?
      0
    2. congela Messages postés 23 Statut Membre
       
      #1052 - Column 'idmateriel' in IN/ALL/ANY subquery is ambiguous

      c'est la ligne 4 qui pose problème...
      0
  10. creadiff Messages postés 483 Statut Membre 57
     
    Dans ce cas...

    SELECT m.nomproduit, m.quantite 
    FROM utilisateur_materiel AS um 
    LEFT OUTER JOIN materiel AS m ON um.idmateriel=m.idmateriel   
    WHERE um.idutilisateur=1 AND m.idmateriel IN 
    (   
        SELECT idmateriel   
        FROM utilisateur_materiel    
        GROUP BY idmateriel     
        HAVING COUNT(idutilisateur) = 1   
    ) 
    

    Il est également possible de procéder ainsi :

    SELECT m.nomproduit, m.quantite 
    FROM utilisateur_materiel AS um 
    LEFT OUTER JOIN materiel AS m ON um.idmateriel=m.idmateriel   
    WHERE um.idutilisateur=1 AND m.idmateriel NOT IN 
    (   
        SELECT idmateriel 
        FROM utilisateur_materiel AS um2 
        WHERE um2.idutilisateur <> um.idutilisateur 
    ) 
    

    Le mieux pour savoir quelle requête choisir est de comparer le temps d'exécution pour chacune.
    N'oublie de bien choisir tes indexes !
    0
  11. congela Messages postés 23 Statut Membre
     
    tes requêtes sont bonnes mais il m'affiche qu'il n'y a pas de données enregistrées.

    mais je crois que si elle ne fonctionne pas sur ma base de données c'est parce que il n'y a pas de lien entre les idmateriels entre eux...
    par exemple, je peux créer:

    idmatriel:1 => nomproduit:gant =>quantité:100
    idmatriel:2 =>nomproduit:gant =>quantité:100
    de même pour idutilisateur

    c'est peut être pour ça qu'il ne trouve pas, non?
    0
  12. congela Messages postés 23 Statut Membre
     
    j'ai trouvé la réponse! on fait
    and nomproduit NOT IN
    entre les 2 requetes sql et ça marche!
    merci beaucoup pour ta patience !
    cordialement
    marion
    0