Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1123 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Comment faire une requete simple

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment faire une requete simple

n°830916
Mazda3
Posté le 24-08-2004 à 16:03:14  profilanswer
 

Bonjour,  
 
(Je suis assez novice en SQL)
 
j'ai 2 tables :
 
utilisateur(id,nom)
possedevoiture(id,id_utilisateur,marque_voiture)
 
J'aimerai avoir une requete assez simple qui ressort, par exemple :
 
Tout les utilisateurs possedant une renault et une peugeot et une mercedes
 
Merci de votre aide

mood
Publicité
Posté le 24-08-2004 à 16:03:14  profilanswer
 

n°830924
vttman
PT, ROT,VTT
Posté le 24-08-2004 à 16:18:49  profilanswer
 

select u.id,u.nom  
from utilisateur u inner join  possedevoiture p
on u.id =p.id_utilisateur
where marque_voiture = 'RENAULT' or  
      marque_voiture = 'PEUGEOT' ...


Message édité par vttman le 24-08-2004 à 16:19:20
n°830925
Mazda3
Posté le 24-08-2004 à 16:20:20  profilanswer
 

Dans la clause where, c'est pas des AND ?
Il faut qu'ils aient au moins ces 3 marques de voitures

n°830932
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-08-2004 à 16:32:07  profilanswer
 

Requête pas si "simple" en fait.
 
Etant donné qu'il faut répondre à la fois à plusieurs conditions portants sur plusieurs lignes d'une même table, il faut utiliser autant d'aliases de la table que conditions. Ca rends la généricité du code bien plus complexe.
 
Je te donne une autre solution qui est un peu plus bidouille, et dont le fonctionnement reste à confirmer (ça m'est venu comme ça dans un éclair de folie :D). Si elle marche, elle est bien mieu dans la mesure ou tu n'as pas besoin de réécrire la requête si tu change le nombre de marques à tester, ou faire des tests style "Personne ayant au moins des voitures de X marques différentes parmis les Y marques"
 
La procédure "classique" :
 
SELECT DISTINCT U.NOM
FROM POSSEDEVOITURE P3, POSSEDEVOITURE P2, POSSEDEVOITURE P1, UTILISATEUR U
WHERE P1.ID_UTILISATEUR = U.ID AND P1.MARQUE_VOITURE = 'RENAULT'
AND P2.ID_UTILISATEUR = U.ID AND P2.MARQUE_VOITURE = 'PEUGEOT'
AND P3.ID_UTILISATEUR = U.ID AND P3.MARQUE_VOITURE = 'CITROEN'
 
=> La, ça va te retourner la liste des utilisateurs qui ont au moins un modèle de chacune des trois marques.
 
Maintenant, il y a une autre solution, qui devrait marcher (à confirmer) qui est moins scolaire.
 
SELECT U.NOM, COUNT(DISTINCT P.MARQUE_VOITURE)
FROM POSSEDEVOITURE P, UTILISATEUR U
WHERE P.UTILISATEUR_ID = U.ID AND P.MARQUE_VOITURE IN ('RENAULT', 'PEUGEOT', 'CITROEN')
GROUP BY U.NOM
HAVING COUNT(DISTINCT P.MARQUE_VOITURE) >= 3
 
=> Ca devrait faire pareil


Message édité par Arjuna le 24-08-2004 à 16:34:47
n°830943
romin
Posté le 24-08-2004 à 16:45:15  profilanswer
 

Arjuna a écrit :


SELECT U.NOM, COUNT(DISTINCT P.MARQUE_VOITURE)
FROM POSSEDEVOITURE P, UTILISATEUR U
WHERE P.UTILISATEUR_ID = U.ID AND P.MARQUE_VOITURE IN ('RENAULT', 'PEUGEOT', 'CITROEN')
GROUP BY U.NOM
HAVING COUNT(DISTINCT P.MARQUE_VOITURE) >= 3
 
=> Ca devrait faire pareil


 
A mon avis, avec cette requète tu vas sélectionner ceux qui ont une renault, une peugeot, ou une citroen et au moins 2 autres voitures de n'importe quelle marque.

n°830958
Sebastien
Posté le 24-08-2004 à 17:07:22  profilanswer
 

La requete Arjuna fonctionne, ca revient au meme d'ecrire :
 
 
SELECT U.NOM
FROM POSSEDEVOITURE P, UTILISATEUR U
WHERE P.UTILISATEUR_ID = U.ID  
AND (P.MARQUE_VOITURE = 'RENAULT'
OR P.MARQUE_VOITURE = 'PEUGEOT'
OR P.MARQUE_VOITURE = 'CITROEN')
GROUP BY U.NOM
HAVING COUNT(P.MARQUE_VOITURE) >= 3


Message édité par Sebastien le 24-08-2004 à 17:12:45
n°830960
Beegee
Posté le 24-08-2004 à 17:12:05  profilanswer
 

romin a écrit :

A mon avis, avec cette requète tu vas sélectionner ceux qui ont une renault, une peugeot, ou une citroen et au moins 2 autres voitures de n'importe quelle marque.


 
non, c'est ok, car il compte les marques distinctes ... et il ne sélectionne que les 3 marques que l'on veut.
 
D'ailleurs, en mettant "HAVING COUNT(DISTINCT P.MARQUE_VOITURE) = 3" c'est pareil mais plus clair ;)

n°830962
Beegee
Posté le 24-08-2004 à 17:12:43  profilanswer
 

Sebastien a écrit :

SELECT U.NOM
FROM POSSEDEVOITURE P, UTILISATEUR U
WHERE P.UTILISATEUR_ID = U.ID  
AND (P.MARQUE_VOITURE = 'RENAULT'
OR P.MARQUE_VOITURE = 'PEUGEOT'
OR P.MARQUE_VOITURE = 'CITROEN')
GROUP BY U.NOM
HAVING COUNT(P.MARQUE_VOITURE) >= 3


 
Ca c'est pas ok, car si la personne a 3 Renault, ça renvoie un résultat ;)

n°830964
Sebastien
Posté le 24-08-2004 à 17:13:44  profilanswer
 

tiens oui j'ai oublié un distinct :p

n°830970
Beegee
Posté le 24-08-2004 à 17:18:10  profilanswer
 

donc ça revient à la requête d'Arjuna, t'as juste changé un IN par des OR ... et enlevé le COUNT qui sert à rien dans le résultat :)

mood
Publicité
Posté le 24-08-2004 à 17:18:10  profilanswer
 

n°830975
romin
Posté le 24-08-2004 à 17:21:46  profilanswer
 

Beegee a écrit :

non, c'est ok, car il compte les marques distinctes ... et il ne sélectionne que les 3 marques que l'on veut.
 
D'ailleurs, en mettant "HAVING COUNT(DISTINCT P.MARQUE_VOITURE) = 3" c'est pareil mais plus clair ;)


ah ok, j'avais pas fait gaffe  ;)

n°830987
Sebastien
Posté le 24-08-2004 à 17:24:42  profilanswer
 

Beegee a écrit :

donc ça revient à la requête d'Arjuna, t'as juste changé un IN par des OR ... et enlevé le COUNT qui sert à rien dans le résultat :)


 
Tout à fait mais la personne a expliquer qu'elle etait novice, donc je lui propose une solution alternative et legerement plus comprehensible.
 
Enfin bon des sa premiere requete se lancer dans des group by et having, j avoue qu'elle doit plus être à ca pres.

n°831031
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-08-2004 à 17:40:51  profilanswer
 

romin a écrit :

A mon avis, avec cette requète tu vas sélectionner ceux qui ont une renault, une peugeot, ou une citroen et au moins 2 autres voitures de n'importe quelle marque.


Non, j'en doute. Le seul truc qui pourrait merder, c'est le COUNT(DISTINCT ...)
 
Si ça merde, alors il suffit d'avoir 3 renaults pour répondre au problème. Par contre, les autres marques que celles cités dans le IN ne seront en aucun cas prises en compte.

n°831037
Arjuna
Aircraft Ident.: F-MBSD
Posté le 24-08-2004 à 17:44:20  profilanswer
 

Sebastien a écrit :

Tout à fait mais la personne a expliquer qu'elle etait novice, donc je lui propose une solution alternative et legerement plus comprehensible.
 
Enfin bon des sa premiere requete se lancer dans des group by et having, j avoue qu'elle doit plus être à ca pres.


Bah moi je trouve que le IN c'est plus simple que des OR entre paranthèses :p
 
Pis surtout, la première requête est pour moi bien plus académique et donc plus simple à assimiler (le having, c'est le truc que tu crois maîtriser et qui passe son temps à ta péter à la fugure...)


Message édité par Arjuna le 24-08-2004 à 17:44:59
n°831579
Sebastien
Posté le 25-08-2004 à 10:11:14  profilanswer
 

Tout à fait, la premiere requete reste la meilleur facon d'être sur de son résultat.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Comment faire une requete simple

 

Sujets relatifs
Optimisation requete simple[MySQL] Comment optimiser une requête pourtant simple ? [c'était moi]
[sql/php] Optimisation simple de requete ?Equivalent SQL Server d'une simple Requete Access
requete tt simple ki me renvoi rien (gro nioub)[SQL] requete (optimisation toute simple help!!!!)
[Access]Requete pas simple.....pbl simple de requete
Requête SQL toute simple.... AIDE SVP[php & mysql] Requête simple, mais pb
Plus de sujets relatifs à : Comment faire une requete simple


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)