Comment faire une requete simple

Comment faire une requete simple - SQL/NoSQL - Programmation

Marsh Posté le 24-08-2004 à 16:03:14    

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

Reply

Marsh Posté le 24-08-2004 à 16:03:14   

Reply

Marsh Posté le 24-08-2004 à 16:18:49    

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
Reply

Marsh Posté le 24-08-2004 à 16:20:20    

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

Reply

Marsh Posté le 24-08-2004 à 16:32:07    

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
Reply

Marsh Posté le 24-08-2004 à 16:45:15    

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.

Reply

Marsh Posté le 24-08-2004 à 17:07:22    

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
Reply

Marsh Posté le 24-08-2004 à 17:12:05    

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 ;)

Reply

Marsh Posté le 24-08-2004 à 17:12:43    

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 ;)

Reply

Marsh Posté le 24-08-2004 à 17:13:44    

tiens oui j'ai oublié un distinct :p

Reply

Marsh Posté le 24-08-2004 à 17:18:10    

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 :)

Reply

Marsh Posté le 24-08-2004 à 17:18:10   

Reply

Marsh Posté le 24-08-2004 à 17:21:46    

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  ;)

Reply

Marsh Posté le 24-08-2004 à 17:24:42    

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.

Reply

Marsh Posté le 24-08-2004 à 17:40:51    

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.

Reply

Marsh Posté le 24-08-2004 à 17:44:20    

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
Reply

Marsh Posté le 25-08-2004 à 10:11:14    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed