SQL Problem

foexle

foexle

Kaiser
Sers Leute,

ich habe ein Problem und weis keine antwort darauf wie ich den SQL-Befehl schreiben kann.

Es geht um folgendes.
Ich habe n artikel in meiner Datenbank, diese sind unterteilt in Kategorien. Also jeder Artikel hat eine bestimmte kategorie. Zusätzlich habe ich ein Timestamp-Feld, das mir anzeigt, wann der artikel geschrieben wurde.
Nun will ich von jeder Kategorie nur alle Artikel haben die älter sind als die neusten 5 der jeweiligen Kategorie
Um das zu erreichen fällt mir nur ein eine schleife zu baun die alle kategorieIDS enthält (6 stück) und dann pro kategrie eine select macht wie

SELECT * FROM kategorie WHERE kategorie_id=#{id} AND public=1 ORDER BY craeted_at DESC OFFSET 5

und das bei jeder id ....
das geht eindeutig nicht
hätte wer ne lösung wo ich das mit einem select mache ?

alle ideen (solange sinnvoll) sind willkommen

greetz
 
ich glaube limit ist dein Freund...
Code:
SELECT * FROM artikel ORDER BY craeted_at DESC LIMIT 4, 30
Sollte dir artikel 5 - 30 anzeigen, ich weiss nicht ob eine 0 nach dem Komma dir alle artikel anzeigt...
evtl. musst du dich noch mit den joins beschäftige... Stichwort: Left Join, right join
 
hi
ne das ist nicht das problem ... das problem ist, das ich auf jede kategorie (teilmenge) dieses anwenden muss und nicht auf die gesamtmenge von allen kategorien....
aber ich glaub es gibt da keine andere möglichkeit als n mal das ganze ab zu fragen ...
ich wüsste da noch andere lösungen, aber der kunde will das nun so auch wenns lahm ist und unnötig den server belastet

naja
muss wohl mit ner schleife alle kategorien einzeln abfragen :(
 
Hi,

vermute mal, wegen LIMIT etc, dass du mit MySQL arbeitest ... na denne:

Du könntest versuchen, dir in einer nested Query zunächst mal eine "Rangliste" nach Alter pro Kategorie zu basteln, und mit einem weiteren SELECT dann davon alles abzuschneiden, was jeweils Rang > 5 hat. Mit einer kleinen Beispieltabelle "test" (Kategorie c, Wert x) könnte das etwa so aussehen:

Code:
select *
from (
        select a.c, a.x, (select count(*) from test b where b.c = a.c and b.x > a.x) rank
        from test a
) c where c.rank < 5
order by c, x desc
;

Die Anpassung (c -> Kategorie, x -> Alter) überlasse ich dann gerne dir :)

Gruss
 
hi,
zeig mal deine create table Anweisung, das mit deiner Kategorie will mir noch nicht klar werden, oder arbeitest du objektorientiert?
im Prinzip kannst du mit (max timestamp -5) in einer subselect-where klausel alles ausklammern was vom letzten Datum -5 ist.

greets
 

Ähnliche Themen

dovecot und postfix Konfiguration Problem

PostgreSQL und Spaltenalias

CMS Problem [php]

Bei PostgreSQL als anderer als der angemeldete Nutzer verbinden - Wo liegt der Fehler

Krieg proftd-mysql nich ans laufen

Zurück
Oben