Requete SQL : C tout con, mais ca me bloque :(

Requete SQL : C tout con, mais ca me bloque :( - SQL/NoSQL - Programmation

Marsh Posté le 27-06-2003 à 11:22:41    

Voila, g une table REVUE(id, nom, date_parution, url, tarif)
 
Je souhaite selectionner uniquement les noms des differentes revues sans les doublons.
 
Si je fais select distinct nom, id, url from revue, il me sort 20 résultats qui correspondent aux 20 memes revues avec des date de parution differente.
 
Est ce que quelq'un a une idée de comment avoir juste les titres ? tout en séléctionnant les id et l'url !

Reply

Marsh Posté le 27-06-2003 à 11:22:41   

Reply

Marsh Posté le 27-06-2003 à 11:29:20    

tu peux pas. si tu fais un distinct sur un champs, les autres ne peuvent pas être différent sinon le SGDB ne sais pas comment te les renvoyer. Sauf s'il dispose d'un moyen de les stocker dans un sous-tableau, mais ca ce n'est pas standard.

Reply

Marsh Posté le 27-06-2003 à 11:30:18    

je c :'(
 
me suis gourré ds la conception des tables, veu pas tout refaire :'(

Reply

Marsh Posté le 27-06-2003 à 11:30:58    

c'est quoi que tu veux faire exactement comme requète?

Reply

Marsh Posté le 27-06-2003 à 11:35:46    

j'ai pas testé du tout mais peut-être que tu peux arriver à quelque chose avec un truc comme ça:

Code :
  1. select T1.uniqueName, T2.id, T2.url from ( select disctinct nom as uniqueName from revue) as T1 inner join revue as T2 on ( T1.uniqueName = T2.nom)

Reply

Marsh Posté le 27-06-2003 à 11:36:00    

bah, g trouvé l'astuce
 
en faite, imagine,  
 
tu es editeur et tu as 30 magazines different. tu veux lister toutes la listes des magazines differents, mais tu peux tres bien avoir 12 magazines d'un meme titre mais avec un mois de parution different
 
il aurai fallu faire 2 tables...
 
mais la je me suis débrouillé, j'avais pas besoin de la clé primaire ID, mais juste du titre et l'url, et comme ces 2 correspondent pour 1 magazine donné, ca me retourne bien ce dont g besoin !

Reply

Marsh Posté le 27-06-2003 à 11:37:20    

Anapajari a écrit :

j'ai pas testé du tout mais peut-être que tu peux arriver à quelque chose avec un truc comme ça:

Code :
  1. select T1.uniqueName, T2.id, T2.url from ( select disctinct nom as uniqueName from revue) as T1 inner join revue as T2 on ( T1.uniqueName = T2.nom)




 
select distinct nom, url from revue  :D  
 
comme ca, ca marche aussi :p

Reply

Marsh Posté le 27-06-2003 à 12:57:58    

1) Vire le ID qui est dans ta requête, et ça marchera.
PS: un distinct porte sur TOUS les champs retournés. Ce sont les tuples qui sont uniques.
 
2) Si tu as besoin de l'ID (pour faire je ne sais quoi), on va dire par exemple que tu veux uniquement le dernier. La requête devient :
 
 


select r1.titre, max(r2.id)
from revue r1, revue r2
where r2.titre = r1.titre
group by r1.titre


 
Testé dans une vraie base, ça marche sans aucun problème.
 
Par contre, c'est très lent (22 secondes pour une table de 7700 lignes), je te conseille de bien positionner tes indexes (dans mon cas, y'avais aucun index utilisable pour la requête, ça explique en partie la lenteur ;))

Reply

Marsh Posté le 27-06-2003 à 13:46:47    

MagicBuzz a écrit :

1) Vire le ID qui est dans ta requête, et ça marchera.
PS: un distinct porte sur TOUS les champs retournés. Ce sont les tuples qui sont uniques.
 
2) Si tu as besoin de l'ID (pour faire je ne sais quoi), on va dire par exemple que tu veux uniquement le dernier. La requête devient :
 
 


select r1.titre, max(r2.id)
from revue r1, revue r2
where r2.titre = r1.titre
group by r1.titre


 
Testé dans une vraie base, ça marche sans aucun problème.
 
Par contre, c'est très lent (22 secondes pour une table de 7700 lignes), je te conseille de bien positionner tes indexes (dans mon cas, y'avais aucun index utilisable pour la requête, ça explique en partie la lenteur ;))


 
tjrs la qd y fo  :hello:

Reply

Sujets relatifs:

Leave a Replay

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