Komplexe LIMIT Angabe

Komplexe LIMIT Angabe

am 13.11.2006 16:05:21 von Ricardo Wickel

Guten Tag NG,

und zwar komme ich, schon allein im Kopf, nicht weiter bei einer
komplexen Limit-Angabe.

Bei einer normalen Angabe, gebe ich den Start der Datensätze an und die
Anzahl.

Wenn ich nun ein Table mit mehreren Einträgen habe, und ich gebe an
LIMIT 4,6 so gibt mir der Query ab dem 4ten Datensatz 6 Stück zurück.

Das ist allerdings nicht das was ich möchte ;-)

In dem Table gibt es eine Time-Spalte - dies vorweg.
Nun möchte ich nicht, das er mir z.B. immer die letzten 5 Datensätze
zurück gibt, sondern er soll mir z.B. je 4 Datensätze von den 5 letzten
Tagen zurück geben.

Dankeschön im voraus.

mfg,
Ricardo Wickel

--
http://doppeltgedacht.de/ | Weblog
http://wiky.de/ | Privat
http://ql-webdesign.de/ | Webdesign/ Programmierung

Re: Komplexe LIMIT Angabe

am 13.11.2006 16:34:15 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Komplexe LIMIT Angabe

am 13.11.2006 16:56:56 von Ricardo Wickel

Andreas Kretschmer schrieb:
> begin Ricardo Wickel schrieb:
>> Guten Tag NG,
>>
>> und zwar komme ich, schon allein im Kopf, nicht weiter bei einer
>> komplexen Limit-Angabe.
>>
>> Bei einer normalen Angabe, gebe ich den Start der Datensätze an und die
>> Anzahl.
>>
>> Wenn ich nun ein Table mit mehreren Einträgen habe, und ich gebe an
>> LIMIT 4,6 so gibt mir der Query ab dem 4ten Datensatz 6 Stück zurück.
>>
>> Das ist allerdings nicht das was ich möchte ;-)
>>
>> In dem Table gibt es eine Time-Spalte - dies vorweg.
>> Nun möchte ich nicht, das er mir z.B. immer die letzten 5 Datensätze
>> zurück gibt, sondern er soll mir z.B. je 4 Datensätze von den 5 letzten
>> Tagen zurück geben.
>
> Schreib eine Funktion, der Du die Anzahl Tage (5) und die Anzahl
> Datensätze(4) übergibts. In der Funktion tust Du über alle Tage
> iterieren und je 4 Datensätze ausgeben (LIMIT 4).
>
> Für PostgreSQL ist das in etwa hier dokumentiert:
> http://www.varlena.com/GeneralBits/26
>
> Eine Alternative für MySQL zu finden überlasse ich Dir zur Übung.

Die Alternative wäre ja dann
http://dev.mysql.com/doc/refman/5.1/de/create-procedure.html
Mein Problem ist dann eher, was ich da rein schreiben muss.

Wie bekomme ich in so einer Funktion alle Datensätze eines bestimmten
Tages(Folgetages, ...), um sie anschließend per Limit zu begrenzen.
Anschließend müssten ja dann alle Datensätze der verschiedenen Tage zu
einem Rückgabewert "mutieren"?


mfg,
Ricardo Wickel

--
http://doppeltgedacht.de/ | Weblog
http://wiky.de/ | Privat
http://ql-webdesign.de/ | Webdesign/ Programmierung

Re: Komplexe LIMIT Angabe

am 13.11.2006 17:20:22 von Axel Schwenke

Ricardo Wickel wrote:
> Guten Tag NG,
>
> und zwar komme ich, schon allein im Kopf, nicht weiter bei einer
> komplexen Limit-Angabe.
....

> In dem Table gibt es eine Time-Spalte - dies vorweg.
> Nun möchte ich nicht, das er mir z.B. immer die letzten 5 Datensätze
> zurück gibt, sondern er soll mir z.B. je 4 Datensätze von den 5 letzten
> Tagen zurück geben.

Und was soll passieren, wenn es an einem Tag weniger als 4 (oder
gar keinen) Eintrag gab? Und wenn es mehr als 4 sind, welche 4
sollen dann verwendet werden?

Abgesehen davon: schreib das doch einfach hin! Mach halt 5 SELECTs
für die 5 Tage und kleistere das Ganze per UNION zusammen. (My)SQL
kennt Möglichkeiten, "heute", "heute - 1 Tag", "heute -2 Tage" etc.
auszudrücken. Mußt du halt mal deine Nase ins Handbuch stecken.


XL

Re: Komplexe LIMIT Angabe

am 13.11.2006 17:53:37 von Ricardo Wickel

Axel Schwenke schrieb:
> Ricardo Wickel wrote:
>> Guten Tag NG,
>>
>> und zwar komme ich, schon allein im Kopf, nicht weiter bei einer
>> komplexen Limit-Angabe.
> ...
>
>> In dem Table gibt es eine Time-Spalte - dies vorweg.
>> Nun möchte ich nicht, das er mir z.B. immer die letzten 5 Datensätze
>> zurück gibt, sondern er soll mir z.B. je 4 Datensätze von den 5 letzten
>> Tagen zurück geben.
>
> Und was soll passieren, wenn es an einem Tag weniger als 4 (oder
> gar keinen) Eintrag gab? Und wenn es mehr als 4 sind, welche 4
> sollen dann verwendet werden?
Wenn gar keinen Eintrag, dann nächster Tag (damit man trotzdem auf 5 kommt).

Die letzten 4 oder Rand(). Aber das ist ja alles sekundär - mein
Problem liegt bei den Tagen.

> Abgesehen davon: schreib das doch einfach hin! Mach halt 5 SELECTs
> für die 5 Tage und kleistere das Ganze per UNION zusammen. (My)SQL
> kennt Möglichkeiten, "heute", "heute - 1 Tag", "heute -2 Tage" etc.
> auszudrücken. Mußt du halt mal deine Nase ins Handbuch stecken.

Und was, wenn ich 10 Tage ausgeben will? Aber ok, ist eine Idee - mal
sehen ob wirs hinbekommen ;-)

Thx


mfg,
Ricardo Wickel

--
http://doppeltgedacht.de/ | Weblog
http://wiky.de/ | Privat
http://ql-webdesign.de/ | Webdesign/ Programmierung

Re: Komplexe LIMIT Angabe

am 13.11.2006 18:01:39 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Komplexe LIMIT Angabe

am 13.11.2006 18:20:31 von Harald Fuchs

In article ,
Ricardo Wickel writes:

> In dem Table gibt es eine Time-Spalte - dies vorweg.
> Nun möchte ich nicht, das er mir z.B. immer die letzten 5 Datens=C3=
=A4tze
> zurück gibt, sondern er soll mir z.B. je 4 Datensätze von den 5
> letzten Tagen zurück geben.

Vielleicht so:

CREATE TABLE articles (
id SERIAL NOT NULL,
dt DATETIME NOT NULL,
PRIMARY KEY (id)
) ENGINE=3DInnoDB;

INSERT INTO articles (dt) VALUES
('2006-11-08 01:00:00'),
('2006-11-09 01:00:00'),
('2006-11-11 01:00:00'),
('2006-11-12 01:00:00'),
('2006-11-12 02:00:00'),
('2006-11-12 03:00:00'),
('2006-11-12 04:00:00'),
('2006-11-13 01:00:00'),
('2006-11-13 02:00:00'),
('2006-11-13 03:00:00'),
('2006-11-13 04:00:00'),
('2006-11-13 05:00:00');

SELECT a.id, a.dt
FROM articles a
JOIN (SELECT DISTINCT date(dt) AS dt
FROM articles
ORDER BY date(dt) DESC
LIMIT 4
) AS d ON d.dt =3D date(a.dt)
WHERE (SELECT count(*)
FROM articles c
WHERE date(c.dt) =3D date(a.dt)
AND c.id <=3D a.id
) <=3D 4
ORDER BY a.dt DESC
;