Hallo!
ich habe eine Tabelle, mit den Spalten: "id", "bild_url", "bewertung", "zeitpunkt_upload" und "zusatz".
In der Spalte "bewertung" steht eine Integerzahl, und in "zusatz" kann entweder 1, 2 oder 3 drin stehen (oder auch "n1", aber das hat hiermit nichts zu tun). Das ist sozusagen eine Art Kategorie.
Nun möchte ich eine Rangliste erstellen (Platz 1 - 300). Allerdings mit der Besonderheit, dass Bilder, die in der Spalte "zusatz" eine 2 oder eine 3 haben, auf jeden Fall in der Rangliste vorkommen müssen. Die id´s der Datensätze mit den zusätzen 2 oder 3 sind bekannt, es sind die id´s 1 - 20 (es sind also nur 20 Bilder, 15 mit zusatz 2, und 5 mit zusatz 3). Alle anderen Datensätze, die 1 als zusatz haben, bekommen per auto increment ihre id.
Wenn es zum Beispiel 280 Bilder mit dem zusatz 1 gibt, und ich eine Rangliste mit den Plätzen 1 - 300 erstellen möchte, ist das ganze kein Problem, da es insgesamt nicht mehr wie 300 Datensätze gibt.
Nun aber ein anderes Beispiel:
Es sind mehr als 280 Bilder mit dem zusatz 1 drin (z.B. 300 Stück), diese haben alle eine bewertung von "400". Die 20 Bilder mit den zusätzen 2 oder 3 haben alle eine Bewertung von 200.
Bei obiger Abfrage würden die letzten 20 Bilder nicht mehr auftauchen, und das darf nicht sein. In diesem Fall müssen die Bilder dann die Plätze 281 - 300 belegen.
Wenn bei gleichem Beispiel allerdings eins der 20 Bilder eine Bewertung von 600 hat, dann muss dieses auch Platz 1 belegen, die anderen 19 dann die Plätze 282 - 300.
Mit anderen Worten soll die Rangliste auf jeden Fall aus 280 Bildern mit dem zusatz 1 bestehen, und dann die 20 Bilder mit den zusätzen 2 und 3. Diese müssen dann nach bewertung und zeitpunkt_upload sortiert sein, wobei die 20 Bilder auf jeden Fall vorkommen müssen, notfalls auf den letzten Plätzen.
Im grude brauche ich also folgende Abfrage:
{SELECT... WHERE zusatz = 1 ORDER BY bewertung... LIMIT 280;
SELECT... WHERE zusatz = 2 OR zusatz = 3 ORDER BY ... LIMIT 20;} ORDER BY bewertung... ;
In Worten : Von denen mit zusatz 1 die 280 mit der höchsten bewertung nehmen, dann die 20 mit den zusätzen 2 und 3 dazupacken, und das ganze dann nochmals sortieren.
eine entsprechende abfrage, oder ein ansatz, wie ich das in php löse, kriege ich einfach nicht hin..... Hat einer eine Idee?
Mfg,
Stefan
ich habe eine Tabelle, mit den Spalten: "id", "bild_url", "bewertung", "zeitpunkt_upload" und "zusatz".
In der Spalte "bewertung" steht eine Integerzahl, und in "zusatz" kann entweder 1, 2 oder 3 drin stehen (oder auch "n1", aber das hat hiermit nichts zu tun). Das ist sozusagen eine Art Kategorie.
Nun möchte ich eine Rangliste erstellen (Platz 1 - 300). Allerdings mit der Besonderheit, dass Bilder, die in der Spalte "zusatz" eine 2 oder eine 3 haben, auf jeden Fall in der Rangliste vorkommen müssen. Die id´s der Datensätze mit den zusätzen 2 oder 3 sind bekannt, es sind die id´s 1 - 20 (es sind also nur 20 Bilder, 15 mit zusatz 2, und 5 mit zusatz 3). Alle anderen Datensätze, die 1 als zusatz haben, bekommen per auto increment ihre id.
Wenn es zum Beispiel 280 Bilder mit dem zusatz 1 gibt, und ich eine Rangliste mit den Plätzen 1 - 300 erstellen möchte, ist das ganze kein Problem, da es insgesamt nicht mehr wie 300 Datensätze gibt.
PHP-Code:
$query = "SECELCT bild_url FROM bilder
WHERE zusatz = 1 or zusatz = 2 or zusatz = 3
ORDER BY bewertung ASC, zeitpunkt_upload DESC
LIMIT 300";
Es sind mehr als 280 Bilder mit dem zusatz 1 drin (z.B. 300 Stück), diese haben alle eine bewertung von "400". Die 20 Bilder mit den zusätzen 2 oder 3 haben alle eine Bewertung von 200.
Bei obiger Abfrage würden die letzten 20 Bilder nicht mehr auftauchen, und das darf nicht sein. In diesem Fall müssen die Bilder dann die Plätze 281 - 300 belegen.
Wenn bei gleichem Beispiel allerdings eins der 20 Bilder eine Bewertung von 600 hat, dann muss dieses auch Platz 1 belegen, die anderen 19 dann die Plätze 282 - 300.
Mit anderen Worten soll die Rangliste auf jeden Fall aus 280 Bildern mit dem zusatz 1 bestehen, und dann die 20 Bilder mit den zusätzen 2 und 3. Diese müssen dann nach bewertung und zeitpunkt_upload sortiert sein, wobei die 20 Bilder auf jeden Fall vorkommen müssen, notfalls auf den letzten Plätzen.
Im grude brauche ich also folgende Abfrage:
{SELECT... WHERE zusatz = 1 ORDER BY bewertung... LIMIT 280;
SELECT... WHERE zusatz = 2 OR zusatz = 3 ORDER BY ... LIMIT 20;} ORDER BY bewertung... ;
In Worten : Von denen mit zusatz 1 die 280 mit der höchsten bewertung nehmen, dann die 20 mit den zusätzen 2 und 3 dazupacken, und das ganze dann nochmals sortieren.
eine entsprechende abfrage, oder ein ansatz, wie ich das in php löse, kriege ich einfach nicht hin..... Hat einer eine Idee?
Mfg,
Stefan
Kommentar