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

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

Marsh Posté le 12-03-2003 à 21:11:09    

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 ?

Reply

Marsh Posté le 12-03-2003 à 21:11:09   

Reply

Marsh Posté le 12-03-2003 à 21:13:40    

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 :.
Reply

Marsh Posté le 12-03-2003 à 21:14:56    

et avec un ptit LEFT JOIN

Reply

Marsh Posté le 12-03-2003 à 21:18:37    

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...

Reply

Marsh Posté le 12-03-2003 à 21:20:27    

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

Reply

Marsh Posté le 12-03-2003 à 21:20:44    

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"

Reply

Marsh Posté le 12-03-2003 à 21:21:17    

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 |

Reply

Marsh Posté le 12-03-2003 à 21:21:45    

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

Reply

Marsh Posté le 12-03-2003 à 21:22:56    

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.

Reply

Marsh Posté le 12-03-2003 à 21:23:47    

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...

Reply

Marsh Posté le 12-03-2003 à 21:23:47   

Reply

Marsh Posté le 12-03-2003 à 21:24:30    

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
Reply

Marsh Posté le 12-03-2003 à 21:30:31    

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...

Reply

Marsh Posté le 12-03-2003 à 21:33:25    

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
Reply

Marsh Posté le 12-03-2003 à 21:35:23    

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

Reply

Marsh Posté le 12-03-2003 à 21:38:13    

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

Reply

Marsh Posté le 12-03-2003 à 21:41:26    

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

Reply

Marsh Posté le 12-03-2003 à 21:50:13    

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 :)

Reply

Marsh Posté le 12-03-2003 à 21:51:12    

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 :)

Reply

Marsh Posté le 12-03-2003 à 22:04:31    

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é.

Reply

Marsh Posté le 12-03-2003 à 22:09:34    

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:

Reply

Marsh Posté le 12-03-2003 à 22:13:58    

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é.
Reply

Marsh Posté le 12-03-2003 à 22:17:17    

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 :)

Reply

Marsh Posté le 12-03-2003 à 22:18:42    

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
Reply

Marsh Posté le 12-03-2003 à 22:31:37    

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é.
Reply

Marsh Posté le 12-03-2003 à 22:32:05    

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

Reply

Marsh Posté le 12-03-2003 à 22:35:42    

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 :/

Reply

Marsh Posté le 12-03-2003 à 22:43:06    

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

Reply

Marsh Posté le 12-03-2003 à 22:46:52    

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

Reply

Marsh Posté le 12-03-2003 à 22:52:06    

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
Reply

Marsh Posté le 12-03-2003 à 22:55:14    

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

Reply

Marsh Posté le 12-03-2003 à 22:56:16    

Au bûcher :D

Reply

Marsh Posté le 12-03-2003 à 22:57:00    

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
Reply

Marsh Posté le 12-03-2003 à 22:57:48    

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
Reply

Marsh Posté le 12-03-2003 à 22:58:10    

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

Reply

Marsh Posté le 12-03-2003 à 23:01:09    

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
Reply

Marsh Posté le 12-03-2003 à 23:01:33    

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
 
...


Reply

Marsh Posté le 12-03-2003 à 23:02:05    

tu pourras pas c'est impossible

Reply

Marsh Posté le 12-03-2003 à 23:03:35    

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 ;))

Reply

Marsh Posté le 12-03-2003 à 23:03:41    

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

Reply

Marsh Posté le 12-03-2003 à 23:05:16    

ça on savait déjà :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed