Queries zusammenfassen...
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aktuelle anzahl
count
date
datei
datensatz
ergebnis
id
limit
log
methode
order
result
set
song
source
spalten
tabelle
update
zugriff
zwischenspeicher
-
Hallo hallo,
ich versage gerade schon wieder in MySQL...
Es geht um eine Website für eine Band. Die möchten ihre Musik online stellen. Dazu haben sie auf der Seite ein Admin-Interface.
Beim Hochladen eines neuen Songs wird ein neuer Datensatz in die Tabelle "music" eingefügt. Er enthält den Timestamp ("timestamp" ), eine ID ("id" ), den Songtitel ("title" ), den Songtext ("text" ) und den Dateinamen auf dem Server ("source" ).
Wenn auf der Website ein Song heruntergeladen wird, wird ein neuer Datensatz in die Tabelle "downloads" eingefügt. Er enthält den Timestamp ("timestamp" ) und die ID des Songs, wie in der Tabelle "music" angegeben ("music_id" ).
Nun soll es im Admin-Tool eine Rangliste geben. Es sollen also alle zur Verfügung stehenden Songs in einer Tabelle angezeigt werden, geordnet nach der Zahl der Downloads, absteigend (= Song mit den meisten Downloads ganz oben, Song mit den wenigsten Downloads ganz unten).
Dazu könnte ich mit einer Schliefe die IDs aus der tabelle "music" auslesen und für jede ID einzeln die Anzahl der Einträge in der Tabelle "downloads" zählen.
Das ist jedoch gerade bei vielen Songs recht ressourcenaufwändig und zudem unsauber programmiert.
Lässt sich die Sache auch mit einem Query machen?
Anmerkung: Es dürfen nur die IDs aus der Tabelle "music" gelesen werden, bei denen das Feld "source" einen Inhalt hat, also eine SOunddatei hochgeladen wurde. Es kann nämlich auch sein, dass nur ein Text eingegeben wird, aber keine Sounddatei hochgeladen.
Vielen Dank...
gruß
ferdinand24
Beitrag geändert: 20.10.2007 21:57:50 von ferdinand24 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
SELECT COUNT(*) as dls,music.* FROM downloads LEFT JOIN music ON downloads.music_id WHERE music.source != '' GROUP BY downloads.music_id ORDER BY dls DESC LIMIT 0,30
MfG Lucas -
Wenn auf der Website ein Song heruntergeladen wird, wird ein neuer Datensatz in die Tabelle "downloads" eingefügt. Er enthält den Timestamp ("timestamp" ) und die ID des Songs, wie in der Tabelle "music" angegeben ("music_id" ).
hm. Meiner Meinung nach wäre es besser, wenn du einfach eine zusätzliche INT-Spalte 'download' hättest, die dann immer per UPDATE music SET ... download=download+1 WHERE id=$SongID hochgezählt wird.
Für die Timestamps+DownloadID könnte man dann zusätzlich eine log-Datei verwenden, denn ich bezweifle, dass außer der Administrative, jemand sich die Zugriffe interessiert.
MySQL ist zwar schnell, aber ich glaube für chronologische Auswertungen sind normale Textdateien besser geeignet. -
Ich persönlich würde die Ergebnisse einfach zwischenspeichern und nur einmal am Tag neu auslesen.
Ergo eine Datenbank z.B. "cache" mit der Spalte id, timestamp, query, result.
Darin speichert man jetzt einfach jede 24 Stunden die Aktuelle Anzahl. Einfach das Ergebnis von dem Query serialisieren.
Die Methode von bladehunter ist natürlich auch möglich, aber irgendwie nicht so schön, wie ich finde.
MfG Lucas -
Ich persönlich würde die Ergebnisse einfach zwischenspeichern und nur einmal am Tag neu auslesen.
Ergo eine Datenbank z.B. "cache" mit der Spalte id, timestamp, query, result.
Darin speichert man jetzt einfach jede 24 Stunden die Aktuelle Anzahl. Einfach das Ergebnis von dem Query serialisieren.
Die Methode von bladehunter ist natürlich auch möglich, aber irgendwie nicht so schön, wie ich finde.
MfG Lucas
Bitte genauer erklären...
bladehunter schrieb:
Wenn auf der Website ein Song heruntergeladen wird, wird ein neuer Datensatz in die Tabelle 'downloads' eingefügt. Er enthält den Timestamp ('timestamp' ) und die ID des Songs, wie in der Tabelle 'music' angegeben ('music_id' ).
hm. Meiner Meinung nach wäre es besser, wenn du einfach eine zusätzliche INT-Spalte 'download' hättest, die dann immer per UPDATE music SET ... download=download+1 WHERE id=$SongID hochgezählt wird.
Für die Timestamps+DownloadID könnte man dann zusätzlich eine log-Datei verwenden, denn ich bezweifle, dass außer der Administrative, jemand sich die Zugriffe interessiert.
MySQL ist zwar schnell, aber ich glaube für chronologische Auswertungen sind normale Textdateien besser geeignet.
1. Ja, das hatte ich auch schon überlegt, aber da ist das Problem, dass die Zahlen ganz schnell mal falsch sein können, das sieht man ja hier bei lima mit den Antworten-Zahlen in den Foren...
Zudem müsste ich dann, wenn ich den Zähler zurücksetze die Tabelle leeren (passiert ohnehin schon) und dazu noch die ganzen Datensätze in der Tabelle "music" ändern.
2. Wieso soll ich denn das Ganze nciht mit in der DB speichern? Meinst du, ich solle den allgemeinen Log (also die zugriffe auf die Website allgemein) auch in extdateien speichern? n einer Datenbank ist das doch viel besser zu handhaben und auszuwerten...
gruß
ferdinand24 -
ferdinand24 schrieb:
Ich persönlich würde die Ergebnisse einfach zwischenspeichern und nur einmal am Tag neu auslesen.
Ergo eine Datenbank z.B. 'cache' mit der Spalte id, timestamp, query, result.
Darin speichert man jetzt einfach jede 24 Stunden die Aktuelle Anzahl. Einfach das Ergebnis von dem Query serialisieren.
Die Methode von bladehunter ist natürlich auch möglich, aber irgendwie nicht so schön, wie ich finde.
MfG Lucas
Bitte genauer erklären...
[...]
<?php $query = base64_encode ('SELECT COUNT(*) as dls,music.* FROM downloads LEFT JOIN music ON downloads.music_id WHERE music.source != '' GROUP BY downloads.music_id ORDER BY dls DESC LIMIT 0,30'); $res = mysql_query ('SELECT COUNT (`id`) as count, `result` FROM `cache` WHERE `timestamp` > '.date () - (60*60*24).' AND `query` = \''.$query.'\' LIMIT 1'); $data = mysql_fetch_assoc ($res); if ($data['count'] > 0) { $data2 = unserialize ($data['result']); } else { $res = mysql_query ('SELECT COUNT(*) as dls,music.* FROM downloads LEFT JOIN music ON downloads.music_id WHERE music.source != '' GROUP BY downloads.music_id ORDER BY dls DESC LIMIT 0,30'); $data2 = array (); while ($res = mysql_fetch_assoc ($result)) { $data2[] = $res; } $data3 = serialize ($data2); mysql_query ('INSERT INTO `cache` SET `timestamp` = '.date ().', `query` = \''.$query.'\', `result` = \''.$data3.'\''); } ?>
MfG Lucas
edit:
Jetzt befinden sich in dem Array $data2 die benötigten Daten.
Beitrag geändert: 21.10.2007 18:51:53 von lucas9991 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage