2014-07-17 5 views
0

J'ai une table Release (id, manga_id, chapterization_id) et une table de Chapterization (id, chapitre).PostgreSQL: DISTINCT ON table MAX d'une autre table

Supposons que je

presse

id | manga_id | chapterization_id 
-------------------------------- 
1 | 44  | 333 
2 | 55  | 222 
3 | 66  | 777 
4 | 44  | 888 
5 | 44  | 999 

Chapterization

id | chapter 
------------ 
111 | 60 
222 | 70 
333 | 80 
444 | 90 
777 | 100 
888 | 120 
999 | 110 

Je veux aller chercher le chapitre maximal (dernier) de chaque manga_id. Manga 44 a 3 chapterizations, mais je veux aller chercher le dernier chapitre de ce qui est 120

Ainsi, le résultat final aurait id avec les versions [2,3,4] Toute idée comment écrire une telle requête dans PostgreSQL?

Répondre

0

Vous pouvez faire cela avec un join et la clause distinct on:

select distinct on (r.manga_id) r.manga_id, c.id, c.chapter 
from release r join 
    chapterization c 
    on r.chapterization_id = c.id 
order by r.manga_id, c.chapter desc; 
+0

Merci, jamais pensé d'utiliser l'ordre pour obtenir la valeur la plus élevée – PeaceDefener

2

Essayez -

select r.manga_id, max(c.chapter) 
    from release r 
    join chapterization c 
    on r.chapterization_id = c.id 
group by r.manga_id 

Sur la base de votre commentaire, si vous voulez aussi le r.id vous pouvez utiliser l'une des méthodes suivantes. La première est une jointure avec une vue en ligne. Deuxième est une sous-requête. Les deux devraient avoir le même résultat et vous donner ce que vous voulez.

select r.manga_id, r.id, c.chapter 
    from release r 
    join chapterization c 
    on r.chapterization_id = c.id 
    join (select r.manga_id, max(c.chapter) as max_chapter 
      from release r 
      join chapterization c 
      on r.chapterization_id = c.id 
     group by r.manga_id) x 
    on r.manga_id = x.manga_id 
    and c.chapter = x.max_chapter 

ou

select r.manga_id, r.id, c.chapter 
    from release r 
    join chapterization c 
    on r.chapterization_id = c.id 
where c.chapter = (select max(c2.chapter) 
         from release r2 
         join chapterization c2 
         on r2.chapterization_id = c2.id 
        where r2.manga_id = r.manga_id) 
+0

Vous pouvez voir ici un violon http://sqlfiddle.com/#!15/1481f/1/0 –

+0

Merci, cela fonctionne, il ne retourne pas r.id colonne si je l'ajoute à SELECT .. r.id doit être dans le groupe ou une fonction agrégée – PeaceDefener

+0

Je l'apprécierais si vous peut obtenir l'ID de sortie en utilisant le groupe par – PeaceDefener