Sql besoin d'aide
vincent
-
vincent -
vincent -
Bonjour à tous,
Est ce que quelqu'un pourrait m'aider, j'ai un tp à rendre mais je n'arrive pas à faire une question.
Voilà en fait,j'ai 3 tables,une table Instruments avec les champs prix,prix_cours,location
la table Eleves avec le nom,l'age et l'instrument qu'il pratique et la table prof avec les champs:nom,age et instrument.
par exemple pour la table Eleves,j'ai une table qui ressemble à ca:
nom age pratique
albert 35 clavecin
albert 35 piano
andre 32 clarinette
aude 22 hautbois
aude 22 flute
...
le but est d'afficher toutes les combinaisons possibles entre 2violons,2violoncelles et 1 contrebasse,c'est à dire la liste des combinaisons de joueurs dont 2 jouent du violon,2 du violoncelle et 1 de la contrebasse.
J'ai fais la requete suivante :
mysql> select e1.nom,e2.nom,e3.nom,e4.nom,e5.nom
-> from Eleves e1,Eleves e2, Eleves e3,Eleves e4,Eleves e5
-> where e1.pratique='Violon' and e2.pratique='Violon' and
-> e3.pratique='Violoncelle' and e4.pratique='Violoncelle'
-> and e5.pratique='Contrebasse'
-> and e1.nom<>e2.nom and e1.nom<>e3.nom and e1.nom<>e4.nom and e1.nom <>e5.
nom
-> and e2.nom<>e3.nom and e2.nom<>e4.nom and e2.nom<>e5.nom and
-> e3.nom<>e4.nom and e3.nom<>e5.nom and e4.nom<>e5.nom group by e1.nom,e2.n
om,e5.nom;
mais le résultat comporte des doublons
+---------+---------+-------+------+----------+
| nom | nom | nom | nom | nom |
+---------+---------+-------+------+----------+
| Luc | Suzanne | Marie | Marc | Isabelle |
| Luc | Thomas | Marie | Marc | Isabelle |
| Luc | Valerie | Marie | Marc | Isabelle |
| Suzanne | Luc | Marie | Marc | Isabelle |
| Suzanne | Thomas | Marie | Marc | Isabelle |
| Suzanne | Valerie | Marie | Marc | Isabelle |
| Thomas | Luc | Marie | Marc | Isabelle |
| Thomas | Suzanne | Marie | Marc | Isabelle |
| Thomas | Valerie | Marie | Marc | Isabelle |
| Valerie | Luc | Marie | Marc | Isabelle |
| Valerie | Suzanne | Marie | Marc | Isabelle |
| Valerie | Thomas | Marie | Marc | Isabelle |
+---------+---------+-------+------+----------+
Est ce que quelqu'un pourrait m'aider??j'ai vraiment tout essayé et je ne vois plus du tout comment faire.
Je vous remercie d'avance pour votre aide.
Est ce que quelqu'un pourrait m'aider, j'ai un tp à rendre mais je n'arrive pas à faire une question.
Voilà en fait,j'ai 3 tables,une table Instruments avec les champs prix,prix_cours,location
la table Eleves avec le nom,l'age et l'instrument qu'il pratique et la table prof avec les champs:nom,age et instrument.
par exemple pour la table Eleves,j'ai une table qui ressemble à ca:
nom age pratique
albert 35 clavecin
albert 35 piano
andre 32 clarinette
aude 22 hautbois
aude 22 flute
...
le but est d'afficher toutes les combinaisons possibles entre 2violons,2violoncelles et 1 contrebasse,c'est à dire la liste des combinaisons de joueurs dont 2 jouent du violon,2 du violoncelle et 1 de la contrebasse.
J'ai fais la requete suivante :
mysql> select e1.nom,e2.nom,e3.nom,e4.nom,e5.nom
-> from Eleves e1,Eleves e2, Eleves e3,Eleves e4,Eleves e5
-> where e1.pratique='Violon' and e2.pratique='Violon' and
-> e3.pratique='Violoncelle' and e4.pratique='Violoncelle'
-> and e5.pratique='Contrebasse'
-> and e1.nom<>e2.nom and e1.nom<>e3.nom and e1.nom<>e4.nom and e1.nom <>e5.
nom
-> and e2.nom<>e3.nom and e2.nom<>e4.nom and e2.nom<>e5.nom and
-> e3.nom<>e4.nom and e3.nom<>e5.nom and e4.nom<>e5.nom group by e1.nom,e2.n
om,e5.nom;
mais le résultat comporte des doublons
+---------+---------+-------+------+----------+
| nom | nom | nom | nom | nom |
+---------+---------+-------+------+----------+
| Luc | Suzanne | Marie | Marc | Isabelle |
| Luc | Thomas | Marie | Marc | Isabelle |
| Luc | Valerie | Marie | Marc | Isabelle |
| Suzanne | Luc | Marie | Marc | Isabelle |
| Suzanne | Thomas | Marie | Marc | Isabelle |
| Suzanne | Valerie | Marie | Marc | Isabelle |
| Thomas | Luc | Marie | Marc | Isabelle |
| Thomas | Suzanne | Marie | Marc | Isabelle |
| Thomas | Valerie | Marie | Marc | Isabelle |
| Valerie | Luc | Marie | Marc | Isabelle |
| Valerie | Suzanne | Marie | Marc | Isabelle |
| Valerie | Thomas | Marie | Marc | Isabelle |
+---------+---------+-------+------+----------+
Est ce que quelqu'un pourrait m'aider??j'ai vraiment tout essayé et je ne vois plus du tout comment faire.
Je vous remercie d'avance pour votre aide.
A voir également:
- Sql besoin d'aide
- Logiciel sql - Télécharger - Bases de données
- Requete sql pix - Forum PHP
- Additions et multiplication dans des requêtes SQL ✓ - Forum MySQL
- Sql query download - Télécharger - Gestion de données
- Ora-00933: la commande sql ne se termine pas correctement ✓ - Forum Oracle
5 réponses
salut
pour éliminer des doublons sans trop réfléchir, j'utilise DISTINCT en tête des expressions :
select distinct e1.nom,e2.nom...
pour éliminer des doublons sans trop réfléchir, j'utilise DISTINCT en tête des expressions :
select distinct e1.nom,e2.nom...
vincent
j'ai essayé mais ça ne marche pas :-(
ok je comprends à l'instant
tu vois le doublon A B C D E / B A C D E
pour contrer ça, tu modifies le prédicat
là, tu peux effectivement te passer de DISTINCT
tu vois le doublon A B C D E / B A C D E
pour contrer ça, tu modifies le prédicat
e1.nom<>e2.nom and e1.nom<>e3.nom and e1.nom<>e4.nom and e1.nom <>e5.nom and e2.nom<>e3.nom and e2.nom<>e4.nom and e2.nom<>e5.nom and e3.nom<>e4.nom and e3.nom<>e5.nom and e4.nom<>e5.nomen
e1.nom<e2.nom and e1.nom<e3.nom and e1.nom<e4.nom and e1.nom <e5.nom and e2.nom<e3.nom and e2.nom<e4.nom and e2.nom<e5.nom and e3.nom<e4.nom and e3.nom<e5.nom and e4.nom<e5.nom
là, tu peux effectivement te passer de DISTINCT
je n'ai pas trop compris ta requete,peux tu me l'expliquer je l'ai tapé mais voilà ce que j'obtiens :
mysql> select e1.nom,e2.nom,e3.nom,e4.nom,e5.nom
-> from Eleves e1,Eleves e2, Eleves e3,Eleves e4,Eleves e5
-> where e1.pratique='Violon' and e2.pratique='Violon' and
-> e3.pratique='Violoncelle' and e4.pratique='Violoncelle'
-> and e5.pratique='Contrebasse'
-> and e1.nom<e2.nom and e1.nom<e3.nom and e1.nom<e4.nom and e1.nom <e5. no
m
-> and e2.nom<e3.nom and e2.nom<e4.nom and e2.nom<e5.nom and
-> e3.nom<e4.nom and e3.nom<e5.nom and e4.nom<e5.nom group by e1.nom,e2.nom
,e5.nom;
Empty set (0.00 sec)
mysql> select e1.nom,e2.nom,e3.nom,e4.nom,e5.nom
-> from Eleves e1,Eleves e2, Eleves e3,Eleves e4,Eleves e5
-> where e1.pratique='Violon' and e2.pratique='Violon' and
-> e3.pratique='Violoncelle' and e4.pratique='Violoncelle'
-> and e5.pratique='Contrebasse'
-> and e1.nom<e2.nom and e1.nom<e3.nom and e1.nom<e4.nom and e1.nom <e5. no
m
-> and e2.nom<e3.nom and e2.nom<e4.nom and e2.nom<e5.nom and
-> e3.nom<e4.nom and e3.nom<e5.nom and e4.nom<e5.nom group by e1.nom,e2.nom
,e5.nom;
Empty set (0.00 sec)
sorry
donc ca serait plutot :
ca permet d'avoir les 2 premiers différents et classés (A B et pas B A) et pas dans d'autres instruments
puis d'avoir les 2 'seconds' différents et classés (C D et pas D C again) et pas dans le 5e instrument
ca te va ?
donc ca serait plutot :
and e1.nom < e2.nom and e1.nom not in (e3.nom, e4.nom, e5.nom) and e2.nom not in (e3.nom, e4.nom, e5.nom) and e3.nom < e4.nom and e3.nom <> e5.nom and e4.nom <> e5.nom
ca permet d'avoir les 2 premiers différents et classés (A B et pas B A) et pas dans d'autres instruments
puis d'avoir les 2 'seconds' différents et classés (C D et pas D C again) et pas dans le 5e instrument
ca te va ?
dans le résultat qui t'était renvoyé tu avais :
A B x y z
puis plus loin
B A x y z
c'est ça que tu appelles un doublon.
pour éliminer la deuxième ligne, il suffit de demander que la 1ere colonne soit inférieure à la seconde colonne
du coup, A B x y z t'est renvoyé mais pas B A x y z car B n'est pas inférieur à A
A B x y z
puis plus loin
B A x y z
c'est ça que tu appelles un doublon.
pour éliminer la deuxième ligne, il suffit de demander que la 1ere colonne soit inférieure à la seconde colonne
du coup, A B x y z t'est renvoyé mais pas B A x y z car B n'est pas inférieur à A
merci pour tes explications,je ne savais pas qu'il y avait des histoires de supérieur et inférieur pour des champs autres que numérique.
en fait,ça veut dire que si la 1ère colonne qui est sélectionné est :A B x y z
et qu'ensuite la ligne B A x y z est trouvé et correspond aussi à mes critères(ce qu'il y a dans le chere)
cette dernière ne sera pas renvoyé car le A se situe après le A c'est bien ça??
Et aussi je voulais te demander concernant le group by pourquoi est ce que je dois mettre group by e1.nom,e2.nom ??
je crois que j'ai tellement modifié mes requetes que je ne suis plus sure d'avoir compris comment marche le group by.
Normalement,ça va classer selon le premier champ.Moi j'avais rajouté d'autres histoire de tester,et avec les deux premiers ca renvoit le bon résultat...
Merci d'avance et désolé pour le dérangement
en fait,ça veut dire que si la 1ère colonne qui est sélectionné est :A B x y z
et qu'ensuite la ligne B A x y z est trouvé et correspond aussi à mes critères(ce qu'il y a dans le chere)
cette dernière ne sera pas renvoyé car le A se situe après le A c'est bien ça??
Et aussi je voulais te demander concernant le group by pourquoi est ce que je dois mettre group by e1.nom,e2.nom ??
je crois que j'ai tellement modifié mes requetes que je ne suis plus sure d'avoir compris comment marche le group by.
Normalement,ça va classer selon le premier champ.Moi j'avais rajouté d'autres histoire de tester,et avec les deux premiers ca renvoit le bon résultat...
Merci d'avance et désolé pour le dérangement
Salut
Voilà comment on pourrait présenter le résultat renvoyé par tes premières requêtes
on distingue bien la 1ere colonne e1.nom, puis la seconde colonne e2.nom, les autres colonnes ne nous intéressent pas dans ce propos
on distingue aussi des lignes dont deux nous intéressent plus particulièrement : celle ou on a A puis B puis d'autres trucs et celle ou on a B puis A puis d'autres trucs (précédemment, ces lignes étaient notées A B x y z et B A x y z)
Le problème des doublons que tu soulevais se présentait car dans ta sélection car tu te contentais de demander que e1.nom soit différent de e2.nom => les 2 lignes respectent la condition et tu y vois un doublon.
Pour éliminer ce doublon il faut ne conserver que A B x y z ou B A x y z
Tu comprends bien que si tu remplaces ton exigence de différence par une exigence de précédence, tu n'as qu'une seule ligne qui la vérifiera :
* si A < B tu conserves A B x y z
* si B < A tu conserves B A x y z
... mais en aucun cas tu ne peux conserver les deux !
le second point de ta question (parce que je suis lancé) : tu dois mettre dans un group by toutes les expressions renvoyées par ton select exceptées les fonctions récapitulatives (sum, count, max, min, etc...)
si tu demandes plein de trucs bien chiadés, count(*) ton group by doit reprendre plein de trucs bien chiadés (et tant que tu t'y plieras pas, ton moteur t'enverra balader)
Voilà comment on pourrait présenter le résultat renvoyé par tes premières requêtes
+--------+--------+--------+ ! e1.nom ! e2.nom ! autres ! +--------+--------+--------+ ! A ! B ! ... ! ! B ! A ! ... ! ! ... ! ... ! ... ! +--------+--------+--------+
on distingue bien la 1ere colonne e1.nom, puis la seconde colonne e2.nom, les autres colonnes ne nous intéressent pas dans ce propos
on distingue aussi des lignes dont deux nous intéressent plus particulièrement : celle ou on a A puis B puis d'autres trucs et celle ou on a B puis A puis d'autres trucs (précédemment, ces lignes étaient notées A B x y z et B A x y z)
Le problème des doublons que tu soulevais se présentait car dans ta sélection car tu te contentais de demander que e1.nom soit différent de e2.nom => les 2 lignes respectent la condition et tu y vois un doublon.
Pour éliminer ce doublon il faut ne conserver que A B x y z ou B A x y z
Tu comprends bien que si tu remplaces ton exigence de différence par une exigence de précédence, tu n'as qu'une seule ligne qui la vérifiera :
* si A < B tu conserves A B x y z
* si B < A tu conserves B A x y z
... mais en aucun cas tu ne peux conserver les deux !
le second point de ta question (parce que je suis lancé) : tu dois mettre dans un group by toutes les expressions renvoyées par ton select exceptées les fonctions récapitulatives (sum, count, max, min, etc...)
si tu demandes plein de trucs bien chiadés, count(*) ton group by doit reprendre plein de trucs bien chiadés (et tant que tu t'y plieras pas, ton moteur t'enverra balader)
resalut,
désolé mais j'ai encore une petite question,est ce que tu saurais par hasard comment je peux faire ça :
en fait jj'ai une table Professeurs avec les attributs nom,age et instrument par exemple Aude 22 flute
ferdinand 42 harpe
a cette table,on doit rajouter une colonne fonction qui peut prendre l'une des 3 valeurs 'chef','professeurs' et directeurs.
ensuite il faut ajouter une colonne chef,qui contiendra la clé primaire du supérieurs hiérarchique de la personne concernée suivant la règle :
chaque chef d'orchestre a pour supérieur hiérarchique ont pour supérieur le directeur de l'école de musique
tt les profeseurs ayant 3 élèves et + ont pour supérieurs le directeur,les autres st indépendants
la clé primaire de professeurs c'est le nom (c'est comme ça que j'ai crée ma table)
par exemple si on insère alexandre,48 ans,qui n'enseigne pas et qui est le directeur
et amélie,30 ans,qui enseigne le hautbois
dans la colonne fonction de amélie on aura chef(chef d'orchestre)
et dans la colonne chef de amelie on devra avoir la clé primaire de son supérieur hiérarchique c'est à dire Alexandre
j'ai crée les 2 nouvelles colonnes comme ça
alter table Professeurs add(fonction varchar(10) check(fonction in('chef'
,'professeur','directeur')));
alter table Professeurs add(chef varchar(30) references Professeurs(nom))
;
mais après je n'arrive pas à insérer la valeur dans la colonne chef avec des requetes.
j'ai essayé avec insert to en essayant de faire une requete,j'ai meme essayé avec des vues,mais rien n'y fait,je m'en sorts pas.
Si quelqu'un pourrait m'aider,ça serait syper sympa.
désolé mais j'ai encore une petite question,est ce que tu saurais par hasard comment je peux faire ça :
en fait jj'ai une table Professeurs avec les attributs nom,age et instrument par exemple Aude 22 flute
ferdinand 42 harpe
a cette table,on doit rajouter une colonne fonction qui peut prendre l'une des 3 valeurs 'chef','professeurs' et directeurs.
ensuite il faut ajouter une colonne chef,qui contiendra la clé primaire du supérieurs hiérarchique de la personne concernée suivant la règle :
chaque chef d'orchestre a pour supérieur hiérarchique ont pour supérieur le directeur de l'école de musique
tt les profeseurs ayant 3 élèves et + ont pour supérieurs le directeur,les autres st indépendants
la clé primaire de professeurs c'est le nom (c'est comme ça que j'ai crée ma table)
par exemple si on insère alexandre,48 ans,qui n'enseigne pas et qui est le directeur
et amélie,30 ans,qui enseigne le hautbois
dans la colonne fonction de amélie on aura chef(chef d'orchestre)
et dans la colonne chef de amelie on devra avoir la clé primaire de son supérieur hiérarchique c'est à dire Alexandre
j'ai crée les 2 nouvelles colonnes comme ça
alter table Professeurs add(fonction varchar(10) check(fonction in('chef'
,'professeur','directeur')));
alter table Professeurs add(chef varchar(30) references Professeurs(nom))
;
mais après je n'arrive pas à insérer la valeur dans la colonne chef avec des requetes.
j'ai essayé avec insert to en essayant de faire une requete,j'ai meme essayé avec des vues,mais rien n'y fait,je m'en sorts pas.
Si quelqu'un pourrait m'aider,ça serait syper sympa.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question