SQL-Abfrage, Array oder anders?
Robert
- php
0 Butterbrot0 Robert0 Butterbrot0 Robert0 butterbrot0 Robert
Hi,
Ich stehe vor einer ziemlich schwierigen Aufgabe.
Ich habe mal ein Newsscript geschrieben, welches ich nun adaptiert auf einer anderen Seite einsetzen will.
Allerdings gibts es nun verschiedene Typen von News. Normale (int wert 0), als auch verschiedene andere (wert 1-momentan 3), die werte stehen in der datenbank natürlich in einem eigenen feld, datentyp int. jede news hat logischerweise auch ein datum.
nun zu meinem problem:
ich will, dass die letzen sieben "normalen" news, sowie die letzten 3 anderen news (egal ob typ 1-3) auf einer seite chronologisch ausgegeben werden. das problem dabei ist, dass ich mehr oder weniger 2 verschiedene typen habe, die vermischt sein können. und ich will nicht erst die "normalen" news auf der seite haben, dann erst die anderen (außer es ist vom datum so gegeben).
da mir kein sql-statement dazu einfällt, bin ich auf die idee gekommen, vielleicht alle daten in ein array zu stecken, und dies dann nach datum zu sortieren. hier weiß ich allerdings noch nicht wie ich es am besten mache (mehrdim. array, eindim, getrnnt durch ein trennzeichen, ...), oder vielleicht gibt es gar eine bessere lösung.
am liebsten wäre mir eine lösung per sql-select, falls möglich.
danke,
mfg robert
em ich glaub ich hab dich miss verstanden, wie genau sieht den deine db aus?
id post type datum
1 dd 0 1.1
2 aa 0 3.1
3 cc 1 8.1
4 ee 1 15.1
5 te 0 28.1
so ?
em ich glaub ich hab dich miss verstanden, wie genau sieht den deine db aus?
id post type datum
1 dd 0 1.1
2 aa 0 3.1
3 cc 1 8.1
4 ee 1 15.1
5 te 0 28.1so ?
naja, so ungefähr.
id, titel,text,autor-id (das übliche halt), NEWS-TYP (int) und ein DATUM (int), welches als unix-timestamp gespeichert wird.
id post type datum
1 dd 0 1.1
2 aa 0 3.1
3 cc 1 8.1
4 ee 1 15.1
5 te 0 28.1
aso, und wie soll die ausgabe ausehen?
id text type datum
1 dd 0 12
2 aa 2 32
3 cc 1 34
4 ee 1 45
5 te 0 456
so, da oben siehst du einmal die db mit daten (einfach)
die ausgabe soll nun so aussehen: (geordnet nach id)
456
45
24
32
12
ABER:
es sollen nur maximal 3 news mit einer id ungleich null angezeigt werden, auch wenn es, nach chronologischer ordnung mehr als 3 gibt, und 7 normale (das ist das problem)
mysql_query("SELECT * FROM table ORDER BY id DESC LIMIT 0 , 3");
so?
mysql_query("SELECT * FROM table ORDER BY id DESC LIMIT 0 , 3");
so?
genau so gehts nicht.
ich will als ausgabe die letzten 3 news mit einem newstyp ungleich null UND die letzten 7 mit dem newstyp 0....diese zeitlich geordnet ;)
mfg
Robert
aso ok
id post type datum
1 dd 0 1.1
2 aa 0 3.1
3 cc 1 8.1
4 ee 1 15.1
5 te 0 28.1
mysql_query("SELECT * FROM table ORDER BY datum DESC WHERE type = 0 LIMIT 0 , 3");
mysql_query("SELECT * FROM table ORDER BY datum DESC WHERE type != 0 LIMIT 0 , 3");
mit zwei abfragen?
mit zwei abfragen?
Dann habe ich wieder das problem, dass erst die eine art von news kommen, dann die anderen.
ich will aber beide arten nach dem datum sortiert haben. untereinander, ineinander , zusammen halt
mfg
Robert
Hallo Robert,
ich will aber beide arten nach dem datum sortiert haben. untereinander, ineinander , zusammen halt
das geht afaik nicht, du könntest höchstens mehr Datensätze abzufragen, und dann beim ausgeben mitzählen, wieviele Datensätze mit newstypw(!=|=)0 schon ausgegeben wurden, und wenn du z.B. von denen mit newstype!=0 schon 3 ausgegeben hast, gibst du eben von dieser Sorte keine mehr aus.
Im Übrigen ist es ganz schlecht das Datum als int zu speichern - für Daten und Zeiten gibt es dafür extra Typen: http://www.mysql.com/doc/de/Date_and_time_types.html.
Grüße aus Nürnberg
Tobias
Moin!
ich will aber beide arten nach dem datum sortiert haben. untereinander, ineinander , zusammen halt
das geht afaik nicht, du könntest höchstens mehr Datensätze abzufragen, und dann beim ausgeben mitzählen, wieviele Datensätze mit newstypw(!=|=)0 schon ausgegeben wurden, und wenn du z.B. von denen mit newstype!=0 schon 3 ausgegeben hast, gibst du eben von dieser Sorte keine mehr aus.
Es wird schwierig sein, das in _einem_ SQL-Statement zu erreichen, das ist wahr. Was mir dazu nur einfällt: Zwei Statements ;) oder UNION, um die Ergebnisse von zwei Statements zu kombinieren. Kann MySQL 3 das schon? Kann man das gemeinsame Ergebnis dann noch sortieren? Ein Blick in die Doku (zu dem ich gerade zu faul bin) sollte das klären können.
Im Übrigen ist es ganz schlecht das Datum als int zu speichern - für Daten und Zeiten gibt es dafür extra Typen: http://www.mysql.com/doc/de/Date_and_time_types.html.
"Ganz schlecht" würde ich es nicht nennen. Die Unix-Zeit läßt sich ja auch wunderbar chronologisch sortieren, und MySQL hat auch Funktionen, die Zeit in ein lesbares Datum umzuwandeln. Aber es ist aus Gründen der Lesbarkeit, wenn man mal "nackt" mit der Datenbank arbeitet, schöner, wenn man ein menschenlesbares Datum vorfindet.
- Sven Rautenberg
Hallo Sven,
Es wird schwierig sein, das in _einem_ SQL-Statement zu erreichen, das ist wahr. Was mir dazu nur einfällt: Zwei Statements ;)
nur will das Robert eben nicht :-)
oder UNION, um die Ergebnisse von zwei Statements zu kombinieren. Kann MySQL 3 das schon?
laut http://www.mysql.de/doc/de/UNION.html, nein.
Ein Blick in die Doku (zu dem ich gerade zu faul bin)
Das ist doch ganz einfach zu finden: "m union" in die Adressleiste eingeben und auf den ersten Ergebnislink klicken - fertig :-)
Im Übrigen ist es ganz schlecht das Datum als int zu speichern - für Daten und Zeiten gibt es dafür extra Typen: http://www.mysql.com/doc/de/Date_and_time_types.html.
"Ganz schlecht" würde ich es nicht nennen. Die Unix-Zeit läßt sich ja auch wunderbar chronologisch sortieren,
richtig, aber...
und MySQL hat auch Funktionen, die Zeit in ein lesbares Datum umzuwandeln.
aber das klappt nicht, wenn der Timestamp als int gespeichert ist.
Grüße aus Nürnberg
Tobias
Moin!
und MySQL hat auch Funktionen, die Zeit in ein lesbares Datum umzuwandeln.
aber das klappt nicht, wenn der Timestamp als int gespeichert ist.
So? Ich hatte mit FROM_UNIXTIME(unixtime,format) eigentlich keine Probleme.
- Sven Rautenberg
Hallo Sven,
und MySQL hat auch Funktionen, die Zeit in ein lesbares Datum umzuwandeln.
aber das klappt nicht, wenn der Timestamp als int gespeichert ist.
So? Ich hatte mit FROM_UNIXTIME(unixtime,format) eigentlich keine Probleme.
uups, du hast recht *schäm* - ich verwende immer DATE_FORMAT() und damit funkionierte es dann nicht.
Grüße aus Nürnberg
Tobias