Comment faire une requete simple - SQL/NoSQL - Programmation
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' ...
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
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 ). 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
Marsh Posté le 24-08-2004 à 16:45:15
Arjuna 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.
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
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
Marsh Posté le 24-08-2004 à 17:12:43
Sebastien a écrit : SELECT U.NOM |
Ca c'est pas ok, car si la personne a 3 Renault, ça renvoie un résultat
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
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. |
ah ok, j'avais pas fait gaffe
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.
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.
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. |
Bah moi je trouve que le IN c'est plus simple que des OR entre paranthèses
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...)
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.
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