Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
798 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  SQL, : Je n'arrive pas à formuler la requète qui va bien...

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Précédente
Auteur Sujet :

SQL, : Je n'arrive pas à formuler la requète qui va bien...

n°331234
ZeBorG
Yes we can!
Posté le 12-03-2003 à 21:11:09  profilanswer
 

Petite question SQL.
 
Je dispose des tables suivante :

Code :
  1. eleve :
  2. id | nom
  3. --------------
  4. 1 | toto
  5. 2 | titi
  6. 3 | tata
  7. (id = index primaire)
  8. remarques :
  9. id | rem
  10. --------------
  11. 1 | bla1
  12. 1 | bla2
  13. 2 | bla3
  14. (pas d'index)

 
 
Ainsi, à chaque élève est associer un id et un nom (1er table). Chaque élève peux avoir 0, 1 ou plusieurs remarques (2nd table).
 
Je veux selectionner l'id, le nom et les remarques de chaque élève.
 
Le problème est qu'avec :
 
SELECT eleve.id, nom, rem
FROM eleve, remarques
WHERE eleve.id = remarques.id
 
j'obtiens :

Code :
  1. id | nom  | rem
  2. --------------------------
  3. 1 | toto | bla1
  4. 1 | toto | bla2
  5. 2 | titi | bla3
  6. 3 | tata |

 
Ne voulant pas obtenir plusieur fois le même élève je dois faire :
 
SELECT eleve.id, nom, rem
FROM eleve, remarques
WHERE eleve.id = remarques.id
GROUP BY eleve.id
 
Et j'obtiens :

Code :
  1. id | nom  | rem
  2. --------------------------
  3. 1 | toto | bla1
  4. 2 | titi | bla3
  5. 3 | tata |

 
Ici, il me manque la remarque bla2 de l'élève toto.
 
Le problème est que j'aimerais connaitre toute les remarques de chaque élèves et ceci en éfectuant qu'un seul SELECT.
 
Des idée ?

mood
Publicité
Posté le 12-03-2003 à 21:11:09  profilanswer
 

n°331243
urd-sama
waste of space
Posté le 12-03-2003 à 21:13:40  profilanswer
 

SELECT DISTINCT je crois
 
edit: nan je dis des conneries, mais le bla2 de toto tu l'as dans ton avant-dernier exemple. je vois pas trop ou tu veux en venir


Message édité par urd-sama le 12-03-2003 à 21:14:45

---------------
.: Clône de Drasche .:. Ebichuleys .:. Avec l'Aloe Vera je fais de beaux cacas [:dawa] .: www.oserselancer.com :.
n°331245
skylight
Made in France.
Posté le 12-03-2003 à 21:14:56  profilanswer
 

et avec un ptit LEFT JOIN

n°331253
ZeBorG
Yes we can!
Posté le 12-03-2003 à 21:18:37  profilanswer
 

Le problème est que ma première solution me renvoi 4 ligne alors qu'il n'y a que 3 élèves. Je veux fair un parcour unique...

n°331258
MagicBuzz
Posté le 12-03-2003 à 21:20:27  profilanswer
 

tu veux quoi au juste ?
 
ça ?
 
 

Code :
  1. id | nom  | rem
  2. --------------------------
  3. 1 | toto | bla1
  4. 1 |      | bla2
  5. 2 | titi | bla3
  6. 3 | tata |


 
C'est impossible sans utiliser des fonctions d'affichage qui sont rarement supportées par le moteur lui-même, mais l'outils de requête (SQL+ d'Oraclepar exemple)
 
C'est à ton traîtement derrière de faire le ménage

n°331260
ZeBorG
Yes we can!
Posté le 12-03-2003 à 21:20:44  profilanswer
 

Skylight a écrit :

et avec un ptit LEFT JOIN

de fair :
"FROM eleve, ramarque WHERE eleve.id=remarques.id"
reviens strictement au même que :
"FROM eleve LEFT JOIN ramarque ON eleve.id=remarques.id"

n°331261
MagicBuzz
Posté le 12-03-2003 à 21:21:17  profilanswer
 

Sinon, si tu veux ça, oublie tout de suite, c'est impossible :
 

Code :
  1. id | nom  | rem
  2. --------------------------
  3. 1 | toto | bla1 bla2
  4. 2 | titi | bla3
  5. 3 | tata |

n°331264
skylight
Made in France.
Posté le 12-03-2003 à 21:21:45  profilanswer
 

SELECT eleve.id,eleve.nom,remarques.rem
FROM eleve NATURAL JOIN remarques

n°331266
MagicBuzz
Posté le 12-03-2003 à 21:22:56  profilanswer
 

ZeBorG a écrit :

de fair :
"FROM eleve, ramarque WHERE eleve.id=remarques.id"
reviens strictement au même que :
"FROM eleve LEFT JOIN ramarque ON eleve.id=remarques.id"


Que tu fasses un LEFT, RIGHT, INNER ou OUTER, ça reviendra au même tes cardinalités sont 1,n dans dont exemple, les LEFT et OUTER ne se font ressentir que lorsque tu as des cardinalités 0,n d'un côté ou de l'autre.
 
Et ça changera rien à ton problème.

n°331270
ZeBorG
Yes we can!
Posté le 12-03-2003 à 21:23:47  profilanswer
 

l'idéal serait un truc comme ça :
 

Code :
  1. id | nom  | rem1 | rem2
  2. --------------------------
  3. 1  | toto | bla1 | bla2
  4. 2  | titi | bla3 |
  5. 3  | tata |      |


(en supposant qu'il n'y ai pas plus de 2 remarques...

mood
Publicité
Posté le 12-03-2003 à 21:23:47  profilanswer
 

n°331272
skylight
Made in France.
Posté le 12-03-2003 à 21:24:30  profilanswer
 

sinon, pour ton probleme, ta premiere solution est la meilleure.
 
(et tu devrai indexer ta deuxieme table)


Message édité par skylight le 12-03-2003 à 21:24:57
n°331287
ZeBorG
Yes we can!
Posté le 12-03-2003 à 21:30:31  profilanswer
 

Skylight a écrit :

sinon, pour ton probleme, ta premiere solution est la meilleure.
 
(et tu devrai indexer ta deuxieme table)

Je veux obtenir autant de ligne que d'élève donc non.
Quant à l'indexage des tables, elle ne sont qu'une simplification des vrais table qui elle disposent des indexage qui vont bien...

n°331292
skylight
Made in France.
Posté le 12-03-2003 à 21:33:25  profilanswer
 

ZeBorG a écrit :

Je veux obtenir autant de ligne que d'élève donc non.
Quant à l'indexage des tables, elle ne sont qu'une simplification des vrais table qui elle disposent des indexage qui vont bien...

dans ce cas tu n'aura jamais toutes les remarques des eleves sur un nombre egal de lignes d'eleves


Message édité par skylight le 12-03-2003 à 21:33:38
n°331295
ZeBorG
Yes we can!
Posté le 12-03-2003 à 21:35:23  profilanswer
 

et en supposant qu'il n'y est que de remarques maximum par eleve ?
 
genre :
SELECT eleve.id, nom, ?? rem1, ?? rem2
...

n°331303
skylight
Made in France.
Posté le 12-03-2003 à 21:38:13  profilanswer
 

une solution est de faire 10 champs remXX ...
 
mais sinon

n°331310
ZeBorG
Yes we can!
Posté le 12-03-2003 à 21:41:26  profilanswer
 

ouais, j'y ai penssé mais je ne peux pas modifier la table en question...

n°331325
mrbebert
Posté le 12-03-2003 à 21:50:13  profilanswer
 

ZeBorG a écrit :

de fair :
"FROM eleve, ramarque WHERE eleve.id=remarques.id"
reviens strictement au même que :
"FROM eleve LEFT JOIN ramarque ON eleve.id=remarques.id"

:non:  
Dans le 1er cas, tu n'auras que les élèves qui ont des remarques, dans le 2ème tu auras tous les éléves, y compris ceux qui n'ont aucune remarque :)

n°331326
skylight
Made in France.
Posté le 12-03-2003 à 21:51:12  profilanswer
 

mrBebert a écrit :

:non:  
Dans le 1er cas, tu n'auras que les élèves qui ont des remarques, dans le 2ème tu auras tous les éléves, y compris ceux qui n'ont aucune remarque :)  

tout a fait :)

n°331354
ZeBorG
Yes we can!
Posté le 12-03-2003 à 22:04:31  profilanswer
 

mrBebert a écrit :

:non:  
Dans le 1er cas, tu n'auras que les élèves qui ont des remarques, dans le 2ème tu auras tous les éléves, y compris ceux qui n'ont aucune remarque :)  

Je viens de faire le test (MySQL 3.23.54) et je maintiens ce que j'ai dis.
Dans les deux cas, même les élèves qui n'ont pas de remarques sont listé.

n°331361
mrbebert
Posté le 12-03-2003 à 22:09:34  profilanswer
 

Avec la requête :
SELECT * FROM eleve, remarque WHERE eleve.id = remarques.id
tu as des lignes de "eleve", qui n'ont pas d'id correspondant dans la table "remarque" :??:  
 
Je demande à voir là :heink:

n°331371
Mara's dad
Yes I can !
Posté le 12-03-2003 à 22:13:58  profilanswer
 

ZeBorG a écrit :

l'idéal serait un truc comme ça :
 

Code :
  1. id | nom  | rem1 | rem2
  2. --------------------------
  3. 1  | toto | bla1 | bla2
  4. 2  | titi | bla3 |
  5. 3  | tata |      |


(en supposant qu'il n'y ai pas plus de 2 remarques...


 
Je ne connais qu'une BDD capable de faire çà : Oracle.
 
Et encore ce serait plutôt :

Code :
  1. id | nom  | rem
  2. --------------------------
  3. 1  | toto | (bla1,bla2)
  4. 2  | titi | (bla3)
  5. 3  | tata | NULL


 
Pour çà, il fait créer un de type de donnée du genre TABLE OF ...
 
Peut-être que Postgres peut le faire ?
 
Sinon, ben t'as plus qu'à faire une première requête pour les id, nom et de boucler dessus pour récupérer les remarques avec une autre nequête répétée autant de fois que t'as d'élève !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°331378
MagicBuzz
Posté le 12-03-2003 à 22:17:17  profilanswer
 

Mara's dad a écrit :


 
Je ne connais qu'une BDD capable de faire çà : Oracle.
 
Et encore ce serait plutôt :

Code :
  1. id | nom  | rem
  2. --------------------------
  3. 1  | toto | (bla1,bla2)
  4. 2  | titi | (bla3)
  5. 3  | tata | NULL


 
Pour çà, il fait créer un de type de donnée du genre TABLE OF ...
 
Peut-être que Postgres peut le faire ?
 
Sinon, ben t'as plus qu'à faire une première requête pour les id, nom et de boucler dessus pour récupérer les remarques avec une autre nequête répétée autant de fois que t'as d'élève !


 
Nan, Oracle sait faire mieu...
 
Je regarde si je retrouve mes cours :)

n°331385
mrbebert
Posté le 12-03-2003 à 22:18:42  profilanswer
 

Tiens, c'est intéressant ca.
Est-ce qu'il existe une fonction qui concatène les lignes réunies par un GROUP BY ?
Par exemple, si on a :
id | value | txt
1  | 5     | aaa
1  | 7     | bbb
2  | 8     | ccc
 
SELECT id, sum(value) FROM ... GROUP BY id va renvoyer
id | sum(value)
1  | 12
2  | 8
 
Est-ce qu'il existe une fonction du même type que le sum, qui concaténerait des chaines de caractères ?
SELECT id, ???(txt) FROM ... GROUP BY id qui renverrait
id | ???(txt)
1  | aaabbb
2  | ccc
 
edit : ca pose un problème quand même. Contrairement aux autres fonctions d'aggrégation, l'ordre aurait son importance :/


Message édité par mrbebert le 12-03-2003 à 23:07:19
n°331437
Mara's dad
Yes I can !
Posté le 12-03-2003 à 22:31:37  profilanswer
 

MagicBuzz a écrit :


 
Nan, Oracle sait faire mieu...
 
Je regarde si je retrouve mes cours :)


 
Alors là tu m'intéresse beaucoup !
 
J'en ai chié des bulles pour une requête de ce genre.
Tout çà pour avoir un XML hiérachique et pas tabulaire...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°331440
MagicBuzz
Posté le 12-03-2003 à 22:32:05  profilanswer
 

Bon, là je m'embrouille tout seul, vous aurez pas la solution :D

n°331454
MagicBuzz
Posté le 12-03-2003 à 22:35:42  profilanswer
 

Je sais qu'il y a une fonction qui permet de retourner les lignes sous forme de colonne.
 
Mais bon, après je vois pas ce qu'on peut en faire au niveau programmation, vu qu'on ne sais pas combien il y a de colonnes.
 
Mais c'est possible :/

n°331475
ZeBorG
Yes we can!
Posté le 12-03-2003 à 22:43:06  profilanswer
 

mrBebert a écrit :

Avec la requête :
SELECT * FROM eleve, remarque WHERE eleve.id = remarques.id
tu as des lignes de "eleve", qui n'ont pas d'id correspondant dans la table "remarque" :??:  
 
Je demande à voir là :heink:  

tout mes excuses, tu as raison.
voici le test :
 
http://wanab.free.fr/test/test.php

n°331494
mrbebert
Posté le 12-03-2003 à 22:46:52  profilanswer
 

ouf, tu m'as fait peur :whistle:  
Finalement, tu ne faisais jamais que remettre en cause tout SQL :D

n°331511
MagicBuzz
Posté le 12-03-2003 à 22:52:06  profilanswer
 

mrBebert a écrit :

ouf, tu m'as fait peur :whistle:  
Finalement, tu ne faisais jamais que remettre en cause tout SQL :D  


je dirait même tout l'algère ensembliste :D


Message édité par MagicBuzz le 12-03-2003 à 22:52:27
n°331529
ZeBorG
Yes we can!
Posté le 12-03-2003 à 22:55:14  profilanswer
 

c'est bon, me suis gouré. On va pas en fair tout un plat...
 
 
 [:cupra]

n°331531
skylight
Made in France.
Posté le 12-03-2003 à 22:56:16  profilanswer
 

Au bûcher :D

n°331532
mrbebert
Posté le 12-03-2003 à 22:57:00  profilanswer
 

MagicBuzz a écrit :


je dirait même tout l'algère ensembliste :D

S'il y a une contradiction dans les maths, ca veut dire que toutes les maths sont fausses ? (démonstration par l'absurde) :whistle:


Message édité par mrbebert le 12-03-2003 à 22:57:25
n°331534
skylight
Made in France.
Posté le 12-03-2003 à 22:57:48  profilanswer
 

Mais comme les maths sont justes depuis des milliers d'années, il est donc certain que ZeBorg a tort :D
 
CQFD :D


Message édité par skylight le 12-03-2003 à 22:58:04
n°331535
MagicBuzz
Posté le 12-03-2003 à 22:58:10  profilanswer
 

Mon Dieu ! Et alors tu ne serais pas mon père :ouch:
 
Quoi ? J'ai dis une connerie ? :D

n°331544
mrbebert
Posté le 12-03-2003 à 23:01:09  profilanswer
 

Skylight a écrit :

Mais comme les maths sont justes depuis des milliers d'années, il est donc certain que ZeBorg a tort :D
 
CQFD :D

As t'on prouvé qu'elles étaient justes ?
 
Je dirais plutot qu'on les croyais justes car on n'avait pas trouvé de contradiction jusqu'à maintenant.
Mais ZeBorg est arrivé, et la lumière fut :sol:  
 
(quoique, j'ai un doute. La lumière qui fut, c'est peut être un autre [:figti] )


Message édité par mrbebert le 12-03-2003 à 23:02:05
n°331546
ZeBorG
Yes we can!
Posté le 12-03-2003 à 23:01:33  profilanswer
 

recentrons le débat...
 
ça ce serai bien :

mrBebert a écrit :

...
 
SELECT id, ???(txt) FROM ... GROUP BY id qui renverrait
id | sum(value)
1  | aaabbb
2  | ccc
 
...


n°331547
MagicBuzz
Posté le 12-03-2003 à 23:02:05  profilanswer
 

tu pourras pas c'est impossible

n°331553
MagicBuzz
Posté le 12-03-2003 à 23:03:35  profilanswer
 

Bon, après y'a impossible et impossible...
 
Normalement, il est impossible de compter le nombre d'occurences d'un mot dans un champ.
 
Vous avez 10 minutes pour trouver une solution pour le faire (bon, j'ai un peu galèré 2 heures dessus le mois dernier avant d'avoir l'illumination ;))

n°331554
ZeBorG
Yes we can!
Posté le 12-03-2003 à 23:03:41  profilanswer
 

et comme vous pouvez le voir sur mon 4ieme test, le sum() ne marche pas :
http://wanab.free.fr/test/test.php

n°331560
MagicBuzz
Posté le 12-03-2003 à 23:05:16  profilanswer
 

ça on savait déjà :D

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  SQL, : Je n'arrive pas à formuler la requète qui va bien...

 

Sujets relatifs
[SQL] Oracle : rafraichissement d'un snapshot[SQL] requête sql sur une base access...help me !!!
[SQL] Un doute sur une requête pour attribuer des droits ?[java][newbie]savoir si le txtfield est bien un int[résolu]
[SQL] un doute sur le "as" dans Access et pour le "SQL pur" ?Ouvrir une popup sur une page existante ou bien fermer la page existan
[SQL] blob et image binaireDes arguments pour expliquer que les normes, c'est bien ?
Plus de sujets relatifs à : SQL, : Je n'arrive pas à formuler la requète qui va bien...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR