VStudio 2008 et SQL Server CE => bug multiple clause AND

[Résolu]
Signaler
Messages postés
19
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
17 octobre 2008
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Bonjour ou bonsoir!

J'ai téléchargé le VStudio Express 2008 C# afin de coder une petite application de gestion d'une bibliothèque de film. J'ai utilisé SQL CE (3.5) comme base de données. J'ai donc créé mes tables, mes fichiers .cs et tout le tralala et ça a très bien fonctionné jusque ici. Cependant, là, je suis confronté à un problème dont j'ignore l'origine ou peut-être est-ce là un bug...

Nivo SQL j'ai une table nommée CATEGO_FILM qui sert de liaison entre ma table FILM et CATEGORIE. Ma table FILM sert à stocker les films avec leur titre. Ma table Catégorie sert à stocker les catégories de film (science-fiction, fantastique, épouvante, etc.). Un film peut donc avoir plusieur catégorie (table CATEGO_FILM). Donc voilà, ça c'était pour planter le décor.

Dans mon application, j'ai développé une fonctionnalité qui permet d'afficher une liste de film en cochant des checkboxs correspondant aux catégories.
J'ai donc dans ma table CATEGO_FILM quelque chose du genre:

ID_FILM | ID_CATEGO
1 | 1
1 | 2
2 | 1
2 | 3
3 | 1
3 | 2

Si je construis ma requete par programmation et que j'obtiens quelque chose comme ceci:
SELECT ID_FILM FROM CATEGO_FILM WHERE ID_CATEGO = 1
alors j'obtiens logiquement les id_films suivant: 1,2,3

Si j'ai plusieurs catégorie, je construis ma requête comme ceci:SELECT ID_FILM FROM CATEGO_FILM WHERE ID_CATEGO <gras>1 AND ID_CATEGO 2</gras>
je devrai avoir l'id du film: 1 et 3 MAIS je n'obtiens rien...

Je ne suis pas un crack en SQL CE mais il me semble que ma requête SQL est correct ou alors il faut utiliser une autre syntaxe pour faire ce que je veux faire...

Avez-vous la clé du problème ?

Merci

8 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
57
Salut,
Je ne suis pas un pro du SQL non plus, mais je ne pense pas que la requete soit correcte (en passant, pour le SQL, tu as meilleur temps de poster sur www.sqlfr.com).
Moi je ferais un group by sur ID_FILM et ensuite un HAVING pour mettre les conditions...
Mais encore une fois, le SQL c'est pas mon fort

<hr />
-My Blog-
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
Bon, j'avais lu ton premier mail un peu vite ;-)

Voici une requête qui marche :

SELECT ID_FILM
FROM CATEGO_FILMWHERE ID_CATEGO 1 OR ID_CATEGO 2
GROUP BY ID_FILM
HAVING COUNT(ID_FILM) =2

Si ton film est de catégorie 1 et 2 alors tu auras 2 enregistrements (films 1 et 3) mais s'il est de catégorie 1 ou 2 tu n'en auras qu'un seul (film 2) et la clause having le retire des enregistrements renvoyés.
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
4
Salut,
Ta requête SQL est correcte.
Le résultat par contre sera :  1,2 et 3
Vérifie que ta table CATEGO_FILM ne soit pas vide:
Select * from CATEGO_FILM
A+
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
Bonjour,

La requête n'est pas correcte car ID_CATEGO ne peut être égal à 1 et à 2 en même temps, il faut utiliser OR au lieu de AND :
SELECT ID_FILM FROM CATEGO_FILM WHERE ID_CATEGO 1 OR ID_CATEGO 2

Tu obtiendras 1,1,3,3 ensuite il faut grouper les enregistrements obtenus si tu souhaites seulement 1,3
SELECT ID_FILM FROM CATEGO_FILM WHERE ID_CATEGO 1 OR ID_CATEGO 2 GROUP BY ID_FILM
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
26 décembre 2011
4
Salut ed73,
Tu as raison je devais avoir la tête dans le coltard dans j'ai répondu.
A+
Messages postés
19
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
17 octobre 2008

Merci pour vos réponses.

ed73,

J'ai déjà tenté le OR et donc fait ceci comme toi: SELECT ID_FILM FROM CATEGO_FILM WHERE ID_CATEGO <gras>1 OR ID_CATEGO 2</gras>

Mais cela me retourne comme id_film: 1,2,3 ! Et c'est logique car l'id_film 2 contient bien l'id_categorie 2.
Ce que je cherche à faire , c'est d'afficher uniquement les films ayant comme id catégorie 1 et 2. Je cherche toujours mais sans succès (enfin pas tout de suite car je suis au boulot là :-) ).

(c'est plus lisible ainsi)
Messages postés
19
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
17 octobre 2008

Salut ed73,

C'est exactement ce que je cherchais et c'est fonctionnel à 100 %

J'ai réussi à automatiser la construction de la requête maintenant et ma recherche est correct! Je savais que j'aurai pas du brosser certain cours de SQL dans le temps .
Parait qu'il y avait aussi une autre solution avec un INTERSECT ... mais celui-ci n'est pas pris en charge par SQL CE.

Merci beaucoup de ton aide en tout cas car j'étais vraiment bloqué.
Bonne journée
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
57
J'avais donc bien raison, héhé.

<hr />
-My Blog-