[SQL] Maximaal 3 items van elke feed ophalen met LIMIT 90

Pagina: 1
Acties:

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik ben bezig met het maken van een webbased RSS nieuwslezer. Hiervoor heb ik twee tabellen: feeds en feeds_items.

Met onderstaande query wil ik van elke feed, de 3 laatst ingevoerde items ophalen, maar met een maximum van 90 items. Heeft de beheerder van de nieuwslezer dus 50 RSS feeds ingevoerd, dan worden alleen van de eerste 30 feeds, de laatste 3 items opgehaald.
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT 
  i.*, f.title AS ftitle, f.link AS flink, f.description AS fdescription, f.image, f.url 
FROM
  feeds_items i 
  INNER JOIN
    feeds f ON i.fid = f.fid 
ORDER BY 
  i.fid ASC, i.timestamp DESC, i.iid DESC
LIMIT
  0, 90


Het lukt mij na een hoop gepruts om maximaal 90 items op te halen (geordend naar feed), maar hoe pak ik alleen de top 3 van elke feed?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Verwijderd

Welke database gebruik je ?

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
MySQL :)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Dit kan MySQL niet in een query... Normaliter zou je zoiets kunnen oplossen door een subquery toe te voegen die per feed de top3 items opvist. Maar MySQL's gebrekkige subquery-ondersteuning (sowieso pas vanaf v4.1) accepteert geen LIMIT erin :X

De naive oplossing is om een losse query uit te voeren waar je maximaal 90 feeds mee ophaalt en dan vervolgens apart per feed de top3 items ophaalt totdat je er genoeg hebt... en ja dat worden in best case 31 en in worst case 91 (tenzij je ook feeds zonder items hebt... dan meer) queries.
Als je per feed, per item de volgorde weet kom je trouwens een stuk beter er vanaf. Maar die volgorde van te voren genereren is ook weer niet triviaal.

[edit]
Om je toch een idee te geven hoe zo'n subquery zou werken:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT 
  i.*, f.* 
FROM
  feeds_items i 
  INNER JOIN
    feeds f ON i.fid = f.fid 
WHERE
  i.iid IN (SELECT iid 
               FROM feeds_items WHERE fid = i.fid
               ORDER BY timestamp DESC, iid DESC
               LIMIT 3)
ORDER BY 
  i.fid ASC, i.timestamp DESC, i.iid DESC
LIMIT
  0, 90

[ Voor 28% gewijzigd door ACM op 15-01-2006 16:25 ]


Verwijderd

Niets aan toe te voegen, zo zie je maar weer hoe belangrijk het is om de type database te vermelden. Succes met de applicatie