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

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
Andrea [ So, 07 Oktober 2007 19:45 ] [ ID #1838502 ]

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

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)
Andreas Kretschmer [ So, 07 Oktober 2007 20:03 ] [ ID #1838503 ]

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

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


"Andreas Kretschmer" <akretschmer [at] spamfence.net> schrieb im Newsbeitrag
news:aljnt4-00m.ln1 [at] 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)
Andrea [ So, 07 Oktober 2007 20:19 ] [ ID #1838504 ]

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

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)
Andreas Kretschmer [ So, 07 Oktober 2007 20:29 ] [ ID #1838505 ]

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

On Sun, 2007-10-07 at 19:45 +0200, Andrea wrote:
> ich m=C3=B6chte ein Bild per Zufall ausw=C3=A4hlen, was =C3=BCber
>
> ORDER BY RAND() ) LIMIT 1
>
> ja ganz gut geht, doch w=C3=BCrde ich gerne das nur einmal pro Tag das Bi=
ld
> 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=C3=A4hlt hast.

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

Wenn du nun das Bild wechselst schaust du zuerst, ob es f=C3=BCr 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).

<Coding entf=C3=A4llt, da ich die verwendete Sprache nicht kenne>

Wenn alle Bilder einmal gezogen wurden, l=C3=B6schst 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=C3=BCr die ggf. nicht MySQL konforme Syntax. Ich denke die Idee wir=
d
aber trotzdem klar.



Mit freundlichen Gr=C3=BC=C3=9Fen,
Dennis Schulmeister

--
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
Dennis Schulmeister [ So, 07 Oktober 2007 20:44 ] [ ID #1838506 ]

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

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)
Stefan+Usenet [ So, 07 Oktober 2007 21:03 ] [ ID #1838507 ]

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

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=C3=A4hlt hast.
>
> CREATE TABLE BilderZiehen
> (
> DATUM DATE PRIMARY KEY,
> BildID ...
> )

Hallo nochmal,

meine Idee von vorhin hat nat=C3=BCrlich einen gravierenden Nachteil: Wenn
beinahe alle Bilde bereits ausgew=C3=A4hlt wurden, verh=C3=A4lt sich der
Algorithmus nicht mehr deterministisch. Es kann unter Umst=C3=A4nden SEHR
lange dauern, bis der Algorithmus ein Ergebnis liefert.

Aus diesem Grund muss die Idee verfeinert werden: Insgesamt drei
Tabellen werden ben=C3=B6tigt.

Eine Tabelle mit allen vorhandenen Bildern:

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

Eine Tabelle mit den bereits ausgew=C3=A4hlten 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=C3=B6schen den Eintrag aus VerfuegbareBilder.
4. F=C3=BCge den Eintrag in GezogeneBilder hinzu.
5. Pr=C3=BCfe, 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=C3=A4lt der Algorithmus keine Schleife. Es ist sicher gestellt,
dass das Bilder Ziehen immer (fast) gleichviel Zeit beansprucht.

Der Schl=C3=BCssel in GezogeneBilder ist =C3=BCbrigens Geschmackssache. Kan=
n pro
Tag nur ein Bild gezogen werden - daf=C3=BCr das selbe Bild aber mehrmals -
oder kann ein Bild nur einmal gezogen werden - daf=C3=BCr aber mehrmals am
Tag?

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

Das sch=C3=B6ne an diesem Algorithmus ist, dass man =C3=BCber den Inhalt de=
r
Tabellen VerfuegbareBilder und GezogeneBilder bestimmen kann, welche
Bilder gezogen werden k=C3=B6nnen, und welche Bilder einfach nur ein das
Datenbank liegen.


Mit freundlichen Gr=C3=BC=C3=9Fen,
Dennis Schulmeister

--
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
Dennis Schulmeister [ Mo, 08 Oktober 2007 00:26 ] [ ID #1839147 ]
Datenbanken » de.comp.datenbanken.mysql » ORDER BY RAND() ) LIMIT 1 , soll aber nur täglich sein

Vorheriges Thema: Konfiguration von MySQL. Öftere Ausfälle von MySql
Nächstes Thema: MySQL Performance CPU 100%