ORDER BY RAND() ) LIMIT 1 , soll aber nur täglich sein

ORDER BY RAND() ) LIMIT 1 , soll aber nur täglich sein

am 07.10.2007 19:45:08 von Andrea

ich möchte ein Bild per Zufall auswählen, was über

ORDER BY RAND() ) LIMIT 1

ja ganz gut geht, doch würde ich gerne das nur einmal pro Tag das Bild
gewechselt wird.

Doch bis jetzt habe ich nichts gefunden.

Andrea

Re: ORDER BY RAND() ) LIMIT 1 , soll aber nur täglichsein

am 07.10.2007 20:03:54 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: ORDER BY RAND() ) LIMIT 1 , soll aber nur täglich sein

am 07.10.2007 20:19:13 von Andrea

Das müsste auch anders als über einen Cronjob funktionieren


"Andreas Kretschmer" schrieb im Newsbeitrag
news:aljnt4-00m.ln1@news.a-kretschmer.de...
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: ORDER BY RAND() ) LIMIT 1 , soll aber nur täglichsein

am 07.10.2007 20:29:31 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: ORDER BY RAND() ) LIMIT 1 , soll aber nur

am 07.10.2007 20:44:31 von Dennis Schulmeister

On Sun, 2007-10-07 at 19:45 +0200, Andrea wrote:
> ich möchte ein Bild per Zufall auswählen, was über
>=20
> ORDER BY RAND() ) LIMIT 1
>=20
> ja ganz gut geht, doch würde ich gerne das nur einmal pro Tag das Bi=
ld=20
> gewechselt wird.

Hallo Andrea,

ich denke, hier musst du etwas kreativ werden. Lege dir eine Tabelle an,
in der du dir merkst, wann du welches Bild ausgewählt hast.

CREATE TABLE BilderZiehen
(
DATUM DATE PRIMARY KEY,
BildID ...
)

Wenn du nun das Bild wechselst schaust du zuerst, ob es für heute scho=
n
ein Bild gibt.

SELECT * FROM BilderZiehen WHERE Datum =3D Today()

Wenn nicht selektierst du ein neues und schreibst einen Eintrag in deine
Merktabelle. Allerdings nur, wenn ein Bild gezogen wird, welches in der
Merktabelle nicht auftaucht. (Schleife).



Wenn alle Bilder einmal gezogen wurden, löschst du die ersten 90% der
Merktabelle.

SELECT Count(*) FROM BilderZiehen INTO Anzahl
Anzahl =3D Anzahl * 0.9
DELETE FROM BilderZiehen WHERE Datum IN
( SELECT Datum FROM BilderZiehen
ORDER BY Datum ASCENDING
UP TO Anzahl ROWS )

Sorry für die ggf. nicht MySQL konforme Syntax. Ich denke die Idee wir=
d
aber trotzdem klar.



Mit freundlichen Grüßen,
Dennis Schulmeister

--=20
Volle Kontaktdaten auf WikiBerd: (http://ncc-1701a.homelinux.net)

http://www.windows3.de - http://www.denchris.de
http://www.audiominds.com - http://www.motagator.net/bands/65

Re: ORDER BY RAND() ) LIMIT 1 , soll aber nur täglichsein

am 07.10.2007 21:03:42 von Stefan+Usenet

On Sun, 7 Oct 2007 19:45:08 +0200 Andrea wrote:
> ORDER BY RAND() ) LIMIT 1

> [...] das nur einmal pro Tag das Bild gewechselt wird.

Wenn es einfach eine brutale Erweiterung Deines SQL-Statements
sein soll, dann ist

| ORDER BY RAND(UNIX_TIMESTAMP(CURDATE())) LIMIT 1

jedenfalls einmal eine Loesung fuer Dein Problem. Ob ein (im
Programm, nicht in der Datenbank organisierter) Cache nicht
sinnvoller waere, solltest Du aber noch einmal ueberlegen.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Für die Sekunden der Einsamkeit - rennen mit Stefan!
(Sloganizer)

Re: ORDER BY RAND() ) LIMIT 1 , soll aber nur

am 08.10.2007 00:26:36 von Dennis Schulmeister

On Sun, 2007-10-07 at 20:44 +0200, Dennis Schulmeister wrote:
> ich denke, hier musst du etwas kreativ werden. Lege dir eine Tabelle an,
> in der du dir merkst, wann du welches Bild ausgewählt hast.
>=20
> CREATE TABLE BilderZiehen
> (
> DATUM DATE PRIMARY KEY,
> BildID ...
> )

Hallo nochmal,

meine Idee von vorhin hat natürlich einen gravierenden Nachteil: Wenn
beinahe alle Bilde bereits ausgewählt wurden, verhält sich der
Algorithmus nicht mehr deterministisch. Es kann unter Umständen SEHR
lange dauern, bis der Algorithmus ein Ergebnis liefert.

Aus diesem Grund muss die Idee verfeinert werden: Insgesamt drei
Tabellen werden benötigt.

Eine Tabelle mit allen vorhandenen Bildern:

CREATE TABLE AlleBilder
(
BildID INTEGER PRIMAR KEY,
BildAttribute ...
)

Eine Tabelle mit den bereits ausgewählten Bildern:

CREATE TABLE GezogeneBilder
(
Datum DATE PRIMARY KEY,
BildID INTEGER FOREIGN KEY REFERENCES Bilder(BildID)
)

Sowie eine Tabelle mit den noch freien Bildern!

CREATE TABLE VerfuegbareBilder
(
BildID INTEGER PRIMARY KEY FOREIGN KEY REFERENCES Bilder(BildID)
)

Zu Anfangs befinden sich in VerfuegbareBilder alle BildIDs aus
AlleBilder. Wenn nun ein Bild gezogen werden soll, geht der Algorithmus
wie folgt vor:

1. Schaue in GezogeneBilder, ob heute bereits ein Bild gezogen
wurde.
2. Wenn nein, selektiere ein beliebiges Bild aus VerfuegbareBilder.
=3D> Aufwand: O(1)
3. Löschen den Eintrag aus VerfuegbareBilder.
4. Füge den Eintrag in GezogeneBilder hinzu.
5. Prüfe, ob VerfuegbareBilder nun leer ist.
6. Wenn ja, transferiere die ersten 90% (oder 75%) aus
GezogeneBilder nach VerfuegbareBilder. =3D> s. mein vorheriges
Posting

Somit enthält der Algorithmus keine Schleife. Es ist sicher gestellt,
dass das Bilder Ziehen immer (fast) gleichviel Zeit beansprucht.

Der Schlüssel in GezogeneBilder ist übrigens Geschmackssache. Kan=
n pro
Tag nur ein Bild gezogen werden - dafür das selbe Bild aber mehrmals -
oder kann ein Bild nur einmal gezogen werden - dafür aber mehrmals am
Tag?

Klar ist, wenn der Datenbank ein neues Bild hinzugefügt wird, muss sei=
ne
ID in VerfuegbareBilder aufgenommen werden. Wird ein Bild gelöscht, mu=
ss
seine ID aus allen Tabellen entfernt werden (ON DELETE CASCADE).

Das schöne an diesem Algorithmus ist, dass man über den Inhalt de=
r
Tabellen VerfuegbareBilder und GezogeneBilder bestimmen kann, welche
Bilder gezogen werden können, und welche Bilder einfach nur ein das
Datenbank liegen.


Mit freundlichen Grüßen,
Dennis Schulmeister

--=20
Volle Kontaktdaten auf WikiBerd: (http://ncc-1701a.homelinux.net)

http://www.windows3.de - http://www.denchris.de
http://www.audiominds.com - http://www.motagator.net/bands/65