8797 sujets

Développement web côté serveur, CMS

Bonjour tout le monde,

voili voilou, ca fait deja une heure que je suis sur une requete SQL croisée sur 2 tables. et la, j'en peux plus, je me décide à demander de l'aide, car je sais qu'il y a des gens très bons ici xD et moi, je suis nul en SQL XD

voili voilou, je m'explique :

j'ai 2 tables : "evenements" et "artistes"

pour l'instant, chaque evenement a un style (hip-hop,trip-hop,rock,blues) et possède plusieurs artistes (chaque artiste possède son propre style aussi).

Pour l'instant, je liste les évènements d'un style bien précis. La requete est :
SELECT * FROM evenements WHERE evenements.style=3

Mais je voudrais aussi listers les evenements qui ne sont pas du style 3, mais qui possède au moins un artiste possédant le style 3...

Je ne sais pas si j'ai été clair, je vais prendre un exemple Smiley langue

L'evenement AAA de style HIP-HOP possède comme artistes IAM et MORCHEEBA.
si je liste tous les évènements HIP-HOP, AAA va sortir.

Mais je voudrais qu'en choisissant le style TRIP-HOP, l'évènement AAA sorte, ce qui n'est pas le cas...

Voila les requetes SQL que j'ai essayé : (artiste_evenement est l'id de l'évènement)


SELECT DISTINCT * FROM evenements,artistes WHERE evenements.id=artistes.artiste_evenement AND evenements.style = 3

SELECT DISTINCT * FROM evenements,artistes WHERE evenements.id=artistes.artiste_evenement AND artistes.style = 3

SELECT DISTINCT * FROM evenements,artistes WHERE evenements.id=artistes.artiste_evenement AND artistes.style = 3 AND evenements.style=3


Yen a qui me font plein de doublons, mais qui marchent pas quand meme, d'autres qui ne marchent pas tout simplement.

Si quelqu'un pouvait m'aider, ce serait super, je vais commencer à pleurer Smiley bawling Smiley bawling


Voili voilou, bonne aprem, et merci !

Léo
Modifié par leo_mac (01 Sep 2008 - 12:40)
Salut

Je suis pas bien sur de moi non plus.

Mais ...

est-ce que ca ne marcherais pas mieux avec 3 tables : evenements, artistes et style

tu mes une clé étrangère dans evenements et artistes qui fait références à la clé primaire de style.

A tester ...
Salut à toi Léo.

Pour commencer je te conseille de mettre tes requettes entre balises [c ode] [/ c ode] pour plus de lisibilitée (ainsi que des respects des règles du forum).

Pour ce qui est de ta requette à tu essayer de t'orienter vers JOIN ? ou vers les "doubles selects" ?

EDIT: Pourrais tu montrer la structure de ta base de donnée aussi car cela me semble un peu fouilli.

Rude
Modifié par ffwrude (29 Aug 2008 - 16:33)
bonjour Arnaud et ffwrude,

tout d'abord, merci pour les conseils (concernant sql et les regles de alsacreations)

En faite, j'ai bel et bien 3 tables : evenements, artistes et styles.
La table styles met en faite la relation entre son id et son nom (hip-hop,trip-hop,etc...)

mais je n'ai besoin que de l'id (se trouvant dans evenements et artistes)
Par ailleurs, vu mes connaissances pitoyables en SQL, je n'ai jamais utilisé des clés étrangères, etc...


J'ai voulu me renseigner sur les différentes possibilités de requetes avec SELECT, et j'ai aussi essayé :


SELECT * FROM evenements JOIN artistes ON evenements.style=artistes.style WHERE artistes.style=3


mais toujours l'erreur... Smiley bawling par ailleurs, je dois l'avouer, je ne comprenais pas énormement ce que je tapais concernant JOIN...

Je ne sais pas du tout ce que sont des double selects, mais surement faire 2 requetes en meme temps ? ca pourrait être la solution ! merci beaucoup !
je vais de ce pas chercher un peu sur le forum et google concernant les "double select".


Décidemment, je suis très mauvais en SQL Smiley decu Smiley langue


Encore merci pour votre aide, je repasse quand j'ai trouvé plus d'infos !

A pluuch!
Salut,

leo_mac a écrit :

Pour l'instant, je liste les évènements d'un style bien précis.
...
Mais je voudrais aussi listers les evenements qui ne sont pas du style 3, mais qui possède au moins un artiste possédant le style 3...

D'après ce que j'en comprends je verrais bien les tables suivantes :

styles
id_style
nom_style


artistes
id_artiste
id_style
nom_artiste


evenements
id_event
id_style
libelle_event


artistes_evenements
id_event
id_artiste

La dernière faisant le lien entre un évènement et chaque artiste y participant (donc un enregistrement par artiste d'un évènement).

Du coup, pour lister tous les évènements dont les artistes ont un style égal à 3 il suffit de faire :
SELECT DISTINCT E.id_event, libelle_event FROM artistes_evenements AS AE, evenements AS E, artistes AS A WHERE A.id_style = 3 AND A.id_artiste = AE.id_artiste AND E.id_event = AE.id_event

A+
Bonjour Heyoan,

merci encore pour ton aide, c'est super sympa !

C'est exactement ce que je voulais, mais si possible sans avoir à créer une nouvelle table.

serait-il possible d'éviter la création de la table evenement_artiste en faisant un double select, ou autre ? je m'explique, je travaille en ce moment sur le back-admin d'un ami (ce n'est pas moi qui l'est cree), et il faudrait changer énormément de fichiers, sachant que c'est un back-admin multi-usage... je peux donc pas modifier ses fichiers Smiley decu Smiley decu

En tout cas, tu m'as lancé une nouvelle piste, je vais voir un peu concernant le double select Smiley cligne

encore merci !

sinon, j'ai trouvé très peu d'informations mais deja, j'ai trouvé ce genre de code :

SELECT * FROM (SELECT field FROM TABLE)


ca m'envoit deja vers une piste xD

Merci encore, je repasse, je fais des essais xD

A pluuch!
leo_mac a écrit :

C'est exactement ce que je voulais, mais si possible sans avoir à créer une nouvelle table.
Le problème de ne pas normaliser les tables c'est d'abord que tu te compliques la vie à chaque traitement (la preuve Smiley lol ) et surtout qu'un jour ou l'autre le traitement sera tout simplement impossible !
Concrètement et d'après ce que tu dis je suppose que dans la table evenements tu as directement les id_artistes (disons 30 champs allant de id_art01 à id_art30) et du coup la requête est une horreur du style
SELECT DISTINCT E.id_event, libelle_event FROM evenements AS E, artistes AS A WHERE A.id_style = 3 
AND (A.id_artiste = E.id_art01 OR A.id_artiste = E.id_art02 OR A.id_artiste = E.id_art03 … 
OR A.id_artiste = E.id_art30)
nono, j'ai ptetre pas tout compris, mais je crois bien que je me suis mélangé les mots... Smiley langue xD xD

en faite, j'ai ma table EVENEMENT contenant id, titre, description,etc...,style_id
et ma table ARTISTE contenant id,nom,etc..,style_id,evement_id,

pour l'instant, je ne liste que les evenements ayant evenement.style_id=3,

en les listant, je peux récuperer pour chaque évènement tous les artistes d'un évènement avec le champ artiste.evenement_id


Ce que je n'arrive pas à faire, c'est de lister TOUS les évènement ayant style_id=3, mais en plus, les évènements liées à un artiste ayant artiste.style_id=3.

Et le pire, c'est que le tout en 1 requete. C'est pour ca, je pensais que la solution serait un SELECT dans un SELECT...

Arf, je m'exprime très mal, surtout quand c'est dans un univers que je connais très mal... Smiley langue
leo_mac a écrit :

ma table ARTISTE contenant id,nom,etc..,style_id,evement_id
Tu veux dire qu'un artiste n'est lié qu'à 1 et 1 seul évènement ?

Etonnant... mais du coup tu peux faire :
SELECT DISTINCT E.id_event, libelle_event from evenements AS E, artistes AS A 
WHERE E.id_event = A.id_event AND (E.id_style = 3  OR A.id_style = 3)
Le système des doubles select est effectivement celui que tu as trouvé.

mais je rejoins l'opinion de Heyoan pour ce qui est de la structuration des tables. Les doubles select sont rapides mais complexe à utiliser au début. C'est pourtant très puissant.

Oriente toi vers cela si tu pense que cela peut être ta solution mais j'avoue ne pas tout suivre à ton schéma.

Rude
rere,

oops, non, je peux avoir plusieurs artistes pour UN evenement, mais pas le contraire Smiley cligne

l'evenement est par exemple :

"soirée UNDERGROUND"
style : hip-hop
groupes :
IAM, MORCHEEBA, DIALECT

on recupere les groupes de la table ARTISTES, avec l'id de l'evenement Smiley cligne


En tout cas, ta derniere requete me parait interessente, elle ne marcherait pas avec plusieurs artistes ? meme en mettant un DISTINCT devant ?

Encore merci pour ton aide, heyoan !
Modifié par leo_mac (29 Aug 2008 - 17:51)
leo_mac a écrit :

oops, non, je peux avoir plusieurs artistes pour UN evenement, mais pas le contraire Smiley cligne
Ce que je veux dire c'est que tu n'as qu'1 champ id_event dans ta table artiste donc 1 artiste n'est lié qu'à 1 évènement.

Par exemple si Morcheeba (excellente !) participe à la "soirée UNDERGROUND" on ne peut pas indiquer que 3 jours plus tard elle participera à la "soirée On The Ground" (et donc, j'insiste lourdement, qu'il faudrait modifier la structure des tables)
Modifié par Heyoan (29 Aug 2008 - 17:56)
bonjour Heyoan,

désolé pour le retard de la réponse, je n'avais pas accès à internet ce weekend Smiley decu

oui, je comprends tout a fait ce que tu veux dire, un évènement est lié a plusieurs artistes, mais un artiste est lié qu'a un seul évènement. c'est pour cela que je n'ai qu'un seul champ "event_id" dans la table "artists" Smiley cligne

le requete voulu devrait lister tous les évènements trip-hop (portishead, wax taylor, etc...), et en plus, par exemple les évènement Hip-hop contenant au moins un artiste de trip-hop (la soirée underground est une soirée hip-hop, mais morcheeba qui y participe est de la trip-hop).

Peut-etre faudrait-il 2 requetes SQL ? ou une requete SQL contenant 2 select... j'ai pas eu le temps de m'y pencher ce week, je pense je vais m'y remettre maintenant Smiley langue

encore merci pour tout Heyoan,
si tu connais les requetes avec INNER JOIN, je aussi très intéressé, c'est peut-etre la solution ! xD

je repasse Smiley langue

A bientot !

bonne soirée

Léo
leo_mac a écrit :

Peut-etre faudrait-il 2 requetes SQL ? ou une requete SQL contenant 2 select... j'ai pas eu le temps de m'y pencher ce week, je pense je vais m'y remettre maintenant Smiley langue


Heyoan a écrit :
SELECT DISTINCT E.id_event, libelle_event from evenements AS E, artistes AS A 
WHERE E.id_event = A.id_event AND (E.id_style = 3  OR A.id_style = 3)


L'écriture avec INNER JOIN est effectivement conseillée pour améliorer les performances mais personnellement pour des requêtes aussi simples j'ai l'habitude de m'en passer. Sinon, tu as un tuto sur developpez.com.
bonjour Heyoan !

aie, je me rends compte de mon bas niveau en SQL... tu viens de me sortir si facilement la requete que j'essaie de trouver depuis 3 jours... Smiley decu Smiley decu

Meeeerci beaucoup Heyoan !

Ca marche nickel !

j'ai utilisé evenements.* pour récuperer tous les champs de la table evenements (car il y en a beaucoup) et ca marche nickel ! juste un petit truc, je ne comprends pas pourquoi, mais quand je met juste "*", ca me fait des doublons, et des bugs...

En tout cas, ca marche nickel ! c'est sur, qu'a voir la requete que tu m'as donné, d'un coup, elle parait simple ! mais je me suis quand meme arracher les cheveux pendant 3 jours xD

meerci encore pour ton aide Heyoan !! xD

A pluuuch !
Bon app

++

Léo
Modifié par leo_mac (01 Sep 2008 - 12:39)