Zufällige Elemente von der Woche des Jahres abhängig

countryqt30

Mitglied
Hallo!

Ich möchte gerne 10 Zeilen (In meinem Fall handelt es sich um die Tabelle "Räume") zufällig auswählen.
Die Schwierigkeit besteht nun darin, dass sich diese 10 nicht mit jeder Abfrage ändern sollen. Sie sollen sich wöchentlich, also abhängig von WEEKOFYEAR (52/53) verändern.
EDIT: Und ggfs. Abhängig vom Jahr, natürlich :).

Die Idee dahinter ist, dass wöchentlich zufällige Räume gefeatured werden sollen.

Mein bisheriger Ansatz war, dass in PHP zu lösen, etwa nach diesem Prinzip (Pseudocode).

Code:
$num_rooms = dbGetNumberOfRooms();
$featuredRoomsIds = generateFeaturedRoomsDependingOnWeekOfYear($num_rooms);
$featuredRooms = dbGetRoomsFromIds($featuredRoomsIds);

An dieser Herangehensweise gefallen mir zwei Dinge nicht.
Zum einen brauche ich zwei Datenbankzugriffe (Anzahl der Räume + Ids in Raumdaten umwandeln + Was ist, wenn innerhalb einer Woche ein neuer Raum hinzugefügt wird? Verfälscht das den Algorithmus? Vermutlich tut es das)
Und zum Anderen finde ich es etwas "viel Arbeit," die da pro Seitenload gemacht wird. Eben zwei Datenbankqueries, und das bei jedem stinknormalen pageload, obwohl die Information für je eine Woche so gut wie statisch ist.
Warum "so gut wie"? Informationen eines Raumes können sich jederzeit ändern, bleiben aber weitgehend konstant.

Was sagt ihr zu der ganzen Geschichte?

grüße,
Michael
 
Zuletzt bearbeitet:
Update
Ich habe mich mal bis zu einem kleinen Query vorgedrungen.

Code:
SELECT 
(YEAR(NOW()) + WEEK(NOW()) + 93521) % COUNT(*) as value,
(YEAR(NOW()) + WEEK(NOW()) + 15123) % COUNT(*) as value,
(YEAR(NOW()) + WEEK(NOW()) + 58232) % COUNT(*) as value,
(YEAR(NOW()) + WEEK(NOW()) + 35113) % COUNT(*) as value,
(YEAR(NOW()) + WEEK(NOW()) + 41761) % COUNT(*) as value,
(YEAR(NOW()) + WEEK(NOW()) + 12365) % COUNT(*) as value,
(YEAR(NOW()) + WEEK(NOW()) + 42422) % COUNT(*) as value,
(YEAR(NOW()) + WEEK(NOW()) + 91826) % COUNT(*) as value
FROM rooms

Ich habe also die einzelnen RoomIds je eine pro Spalte.
Hat jemand eine Idee, wie ich daraus die ordentlichen Raum-Infos = ( SELECT * FROM rooms WHERE id in (...)) bekommen kann?


PS: Wenn es komplett andere Vorgehensweisen bezueglich der gefeatureten Raeume gibt, die als sinnvoller erscheinen, immer her damit! :)
 
Irgendwie versteh ich nur Bahnhof von dem was du willst.

Es sollen jede Woche 10 beliebige Räume ausgewählt werden?

Ich würde das so lösen.
Eine Tabelle rnd_rooms erstellen.

SQL:
CREATE TABLE rnd_rooms(
    -- Jahr & Monat speichern
    yw INT,
    -- und die id der Tabelle rooms
    room_id INT
);

In diese Tabelle werden für jede Woche 10 Einträge erstellt (siehe weiter unten). Dann kannst du so die 10 Rooms auslesen
SQL:
SELECT 
	r.*
FROM
	rooms		AS r,
	rnd_rooms	AS rnd
WHERE
	rnd.room_id = r.room_id
	AND rnd.yw = YEARWEEK(NOW());

Wenn das Select keine Daten liefert, dann hast du eine neue Woche. Ergo müssen noch schnell 10 neue Räume gefunden werden. Anschliessend das SQl nochmals ausführen. Dies würde ich in PHP steuern. Das kommt auch nur einmal pro Woche vor und dann hast du ja wieder Daten...

Und hier der Code um die 10 Räume für die aktuelle Woche zu generieren
SQL:
INSERT INTO rnd_rooms (yw, room_id)
SELECT
	--Jahr und Woche bestimmen
	YEARWEEK(NOW()) AS yw,
	room_id
FROM rooms
-- Nach Zufallszahl sortieren
ORDER BY RAND()
-- Die ersten 10 Auswählen
LIMIT 10;

PS: Alles ungetestet, kann also Fehler beinhalten
 
Zuletzt bearbeitet von einem Moderator:
Zurück