[SQL] Probleme tout con avec 2 ID

Probleme tout con avec 2 ID [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 08-03-2006 à 20:07:19    

Bonjour,  
 
Un pote en génie electronique m'a demandé de l'aider ds son exo SQL, mais ... je ne me souviens pas vraiment de mes cours de l'année derniere, et n'ayant que peu pratiqué, je me retoruve coincé.  
 
C'est tout con, pourtant:
2 tableaux pour la gestion d'une bibliothèque:
 
id / nom/ prenom / sexe
id / idliv
 
Il s'agit d'afficher la liste (nom,prenom) du ou des individus ayant le plus de livres empruntés
On fait ça avec un sub-select, ou un ou plusieurs AND dans le WHERE ?
 
'me rappelle plus :sweat:


Message édité par ParadoX le 08-03-2006 à 20:07:41

---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 08-03-2006 à 20:07:19   

Reply

Marsh Posté le 08-03-2006 à 20:36:09    

Code :
  1. select *
  2. from individu
  3. where id in
  4. (select id
  5. from individu_a_livre
  6. group by id
  7. having count(*) =
  8. (select max(nombre_de_livres)
  9.   from (select count(*) as nombre_de_livres
  10.         from individu_a_livre
  11.         group by id));


 
Maintenant, avec des versions récentes des SGBD, on peut utiliser des fonctions analytiques permettant de pas mal simplifier ... mais en pur SQL, la solution ci-dessus devrait marcher.


Message édité par Beegee le 08-03-2006 à 22:18:40
Reply

Marsh Posté le 08-03-2006 à 21:15:37    

Hello,
 
moi, à vue de nez, je dirai que un count avec jointure et un order devarit suffire sans avoir besoin d'imbriquer sur 3 niveaux.

Reply

Marsh Posté le 08-03-2006 à 21:21:34    

Hm merci à vous 2, par contre les "jointures" j'ai jamais fait ça ... 'fin jvais chercher :)


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 08-03-2006 à 22:19:22    

J'ai simplifié la requête, y avait une jointure inutile ...
 
sub1, si tu as une façon plus simple de faire, je suis partant :)

Reply

Marsh Posté le 09-03-2006 à 00:52:44    

Beegee a écrit :

sub1, si tu as une façon plus simple de faire, je suis partant :)


Hello,  
comme ca ?
 

Code :
  1. SELECT ind.nom, ind.prenom, count( il.idliv ) AS cnt
  2. FROM individu_a_livre AS il, individu AS ind
  3. WHERE il.id = ind.id
  4. GROUP BY ind.id
  5. ORDER BY cnt DESC


 
ca marche sur un test sous mysql 5.


Message édité par sub1 le 09-03-2006 à 00:53:43
Reply

Marsh Posté le 09-03-2006 à 09:53:50    

Ce n'est pas du SQL standard.
mySql permet de sélectionner des champs dans un group by qui ne devraient pas pouvoir l'être ... (normalement il faut utiliser des fonctions de groupage : SUM, COUNT, etc.).
 
De plus, tu ne récupères pas uniquement les infos qui t'intéressent, mais les infos pour tous les individus, donc il te faut mettre de la logique dans le script lançant la requête ...
 
Et enfin, je suis pas certain du comportement de mySql quand on sélectionne des champs autres que la clé de groupement, sans utiliser de fontions SUM / COUNT ... Il sélectionne une ligne parmi toutes ?

Reply

Sujets relatifs:

Leave a Replay

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