Requete sql selectionner données redondantes
Résolu/Fermé
congela
Messages postés
23
Date d'inscription
samedi 2 juillet 2011
Statut
Membre
Dernière intervention
11 août 2011
-
Modifié par congela le 3/07/2011 à 23:27
congela Messages postés 23 Date d'inscription samedi 2 juillet 2011 Statut Membre Dernière intervention 11 août 2011 - 5 juil. 2011 à 17:13
congela Messages postés 23 Date d'inscription samedi 2 juillet 2011 Statut Membre Dernière intervention 11 août 2011 - 5 juil. 2011 à 17:13
A voir également:
- Requete sql selectionner données redondantes
- Blob sql ✓ - Forum Webmastering
- Effacer les données de navigation - Guide
- Récupération serveur sql - Télécharger - Gestion de données
- Exemple base de données access à télécharger gratuit - Forum Access
- Reinstaller windows sans perte de données - Guide
11 réponses
creadiff
Messages postés
445
Date d'inscription
samedi 3 avril 2010
Statut
Membre
Dernière intervention
3 novembre 2011
57
4 juil. 2011 à 01:26
4 juil. 2011 à 01:26
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 ?
Sinon, j'ai du mal à comprendre ce que tu cherches... la requête que tu utilises actuellement ne fonctionne pas ?
congela
Messages postés
23
Date d'inscription
samedi 2 juillet 2011
Statut
Membre
Dernière intervention
11 août 2011
4 juil. 2011 à 08:44
4 juil. 2011 à 08:44
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
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
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
Leviathan49
Messages postés
257
Date d'inscription
jeudi 10 juin 2010
Statut
Membre
Dernière intervention
22 juillet 2011
70
4 juil. 2011 à 09:04
4 juil. 2011 à 09:04
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
congela
Messages postés
23
Date d'inscription
samedi 2 juillet 2011
Statut
Membre
Dernière intervention
11 août 2011
4 juil. 2011 à 11:15
4 juil. 2011 à 11:15
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
mais ça ne marche pas...
merci d'avance
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Leviathan49
Messages postés
257
Date d'inscription
jeudi 10 juin 2010
Statut
Membre
Dernière intervention
22 juillet 2011
70
4 juil. 2011 à 12:19
4 juil. 2011 à 12:19
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
congela
Messages postés
23
Date d'inscription
samedi 2 juillet 2011
Statut
Membre
Dernière intervention
11 août 2011
Modifié par congela le 4/07/2011 à 14:44
Modifié par congela le 4/07/2011 à 14:44
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:
pour le materiel en commun, ma requete est:
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!
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!
Leviathan49
Messages postés
257
Date d'inscription
jeudi 10 juin 2010
Statut
Membre
Dernière intervention
22 juillet 2011
70
Modifié par Leviathan49 le 4/07/2011 à 15:00
Modifié par Leviathan49 le 4/07/2011 à 15:00
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 )
congela
Messages postés
23
Date d'inscription
samedi 2 juillet 2011
Statut
Membre
Dernière intervention
11 août 2011
4 juil. 2011 à 16:11
4 juil. 2011 à 16:11
j'aimerai dire que ca marche, malheureusement ce n'est pas le cas!
Leviathan49
Messages postés
257
Date d'inscription
jeudi 10 juin 2010
Statut
Membre
Dernière intervention
22 juillet 2011
70
Modifié par Leviathan49 le 4/07/2011 à 16:28
Modifié par Leviathan49 le 4/07/2011 à 16:28
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 ?
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 ?
congela
Messages postés
23
Date d'inscription
samedi 2 juillet 2011
Statut
Membre
Dernière intervention
11 août 2011
4 juil. 2011 à 16:32
4 juil. 2011 à 16:32
#1052 - Column 'idmateriel' in IN/ALL/ANY subquery is ambiguous
c'est la ligne 4 qui pose problème...
c'est la ligne 4 qui pose problème...
creadiff
Messages postés
445
Date d'inscription
samedi 3 avril 2010
Statut
Membre
Dernière intervention
3 novembre 2011
57
Modifié par creadiff le 4/07/2011 à 21:03
Modifié par creadiff le 4/07/2011 à 21:03
Dans ce cas...
Il est également possible de procéder ainsi :
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 !
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 !
congela
Messages postés
23
Date d'inscription
samedi 2 juillet 2011
Statut
Membre
Dernière intervention
11 août 2011
5 juil. 2011 à 12:43
5 juil. 2011 à 12:43
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?
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?
congela
Messages postés
23
Date d'inscription
samedi 2 juillet 2011
Statut
Membre
Dernière intervention
11 août 2011
5 juil. 2011 à 17:13
5 juil. 2011 à 17:13
j'ai trouvé la réponse! on fait
merci beaucoup pour ta patience !
cordialement
marion
and nomproduit NOT INentre les 2 requetes sql et ça marche!
merci beaucoup pour ta patience !
cordialement
marion