Pb de requête pour l'affichage d'une liste pour une médiathèque

Bonjour,
Je veux afficher la liste suivante des différents éléments de la médiathèque.

id_oeuvre titre genre support date_parution

le problème c’est qu’il y a plusieurs table genre (genre_livre, genre_cd et genre_dvd) en fonction du support (cd, dvd, livre)

voici les tables que j’utilise
OEUVRE(id_oeuvre, id_auteur, id_editeur, id_genre, id_support, titre, descriptif, date_parution)
SUPPORT(id_support, support)
GENRE_CD(id_genre, genre)
GENRE_DVD(id_genre, genre)
GENRE_LIVRE(id_genre, genre)

j’utilise la requette suivante pour afficher ma liste, mais je ne sait pas comment selectionner le genre en fondtion des 3 tables du genre.
Là je n’utilise que genre_livre, pour avoir une requete qui donne quelque chose.

SELECT o.id_oeuvre, o.titre, genre, o.date_parution, s.support FROM oeuvre o, genre_livre gl, support s WHERE o.id_genre = gl.id_genre and o.id_support = s.id_support GROUP BY o.id_oeuvre ORDER BY gl.genre, o.titre;

Comment faire pour avoir les genres correspondant aux supports?

Merci de vos réponses

Dams

ton modèle est peut être incomplêt non? A moins que support ne référence le support (dvd, cd ou livre?)

Ca devrait etre bon :
[cpp]SELECT
O.id_oeuvre,
O.id_auteur,
O.id_genre,
O.id_support,
O.titre,
O.descriptif,
O.date_parution
FROM oeuvre O
INNER JOIN support S ON O.id_support = S.id_support
LEFT JOIN genre_cd C ON S.support = ‘cd’ AND O.id_genre = C.id_genre
LEFT JOIN genre_dvd D ON S.support = ‘dvd’ AND O.id_genre = D.id_genre
LEFT JOIN genre_livre E ON S.support = ‘livre’ AND O.id_genre = E.id_genre
GROUP BY O.id_oeuvre
ORDER BY COALESCE(C.genre, D.genre, E.genre), O.titre[/cpp]

A noter : tes tables GENRE_* me semblent inutiles, puisqu’elles sont strictement identiques en propriété, tu aurais plus vite faite de stocker le type de support dedans.

comme le dis Sans-Nom, fait une table GENRE ou plutot CATEGORIES c’est plus explicite,qu’il te faut par contre modifier :

une stucture comme cela devrait faire l’affaire (assez courant) : CATEGORIES(idcat,idcat_parente,nom_cat)

Ainsi tu stockes des catégories et sous-catégorie :slight_smile:

ok je vous remercie, je vais assayer la requete proposé et pourquoi pas ensuite modifier ma table genre.

J’ai remodifié mes tables,
les voici,


OEUVRE(id_oeuvre, id_auteur, id_editeur, id_genre, id_support, titre, descriptif, date_parution) 
SUPPORT(id_support, support) 
GENRE(id_genre, id_support, genre)
EDITION(id_editeur,editeur)
AUTEUR(id_auteur,nom_aut,prenom_aut)

je veux faire sur tout les champs et retourner (id_oeuvre,titre,genre,support,date_parution) mais quand je fais ma recherche, je n’ai pas le bon genre et le bon support en résultat.
Voici ma requette


SELECT id_oeuvre,titre,support,genre,date_parution
FROM genre g,oeuvre o,auteur a,edition e,support s
WHERE s.support LIKE ('%motcle%')
OR o.titre LIKE ('%motcle%')
OR g.genre LIKE ('%motcle%')
OR o.date_parution LIKE ('%motcle%')
OR o.descriptif LIKE ('%motcle%')
OR e.editeur LIKE ('%motcle%')
OR a.nom_aut LIKE ('%motcle%')
OR a.prenom_aut LIKE ('%motcle%')
and s.id_support=o.id_support
and g.id_genre=o.id_genre
GROUP BY o.id_oeuvre ORDER BY g.genre,o.titre;


avez vous une idée de la requete nécessaire.
Merci


SELECT id_oeuvre,titre,support,genre,date_parution
FROM genre g,oeuvre o,auteur a,edition e,support s
WHERE s.id_support=o.id_support
and g.id_genre=o.id_genre
and (
s.support LIKE ('%motcle%')
OR o.titre LIKE ('%motcle%')
OR g.genre LIKE ('%motcle%')
OR o.date_parution LIKE ('%motcle%')
OR o.descriptif LIKE ('%motcle%')
OR e.editeur LIKE ('%motcle%')
OR a.nom_aut LIKE ('%motcle%')
OR a.prenom_aut LIKE ('%motcle%')
)
GROUP BY o.id_oeuvre ORDER BY g.genre,o.titre;


essaye comme ca

Merci pour ta reponse, mais c’est bizarre car quand je rentre un mot clé concernant le support (dvd), il me sort des support avec “livre ou cd” alors que je suis sur que dans les oeuvres livre ou cd il n’y a pas ces mots clé. et vis vers ça.

J’ai supprimé la recherche sur le support et ça à l’air de marché avec d’autre mot clé…
à voir lors du fonctionnement final si il n’y a pas de bug de temps en temps.

@+

vos group by servent à quoi???

j’ai fait un copié collé de sa requete, pas pensé à enlever le group by inutile

ok :smiley: :stuck_out_tongue:

Je me demandais… :wink: . A moins de vouloir ralentir le truc… :lol:

Si j’enlève le group by, j’ai plusieurs fois la même oeuvre en réslutat.
Il y a peut être une solution qui pourrait remplacer le group by, mais je ne la connais pas.
Si tu as une idée b_gregory sur le group by et même sur le problème avec le support.

Je pense que la requete de recherche pourrait être optimisé mais je ne voie pas commment.

Merci de vos réponses

Tu devrais essayer ça au début de ta requête:

[cpp]

SELECT distinct id_oeuvre

[/cpp]

:stuck_out_tongue:

ok merci.

j’ai toujours un problème de résultat incohérant.
Quand je fais une recherche sur un mot, j’ai des résultats qui ne corresponde pas à ma recherche.
Est ce que je devrait m’y prendre autrement pour faire mafonction de recherche ou est ce que c’est la requete qui n’est pas optimisé.