forum.coppermine-gallery.net

Support => Deutsch (German) => Language Specific Support => cpg1.4.x Deutsch (German) => Topic started by: kaiwahn on December 22, 2008, 03:58:27 pm

Title: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: kaiwahn on December 22, 2008, 03:58:27 pm
Hallo Galeriefreunde

auf meiner Startseite www.fotofreunde-oberhausen.de hab ich die Galerie soweit eingebunden, sodas die Funktionen gegeben sind.

Nun mein Problem, ich möchte das Bild der Woche, des Monats, des Jahres auf dem Portal mit einbinden, habe die jeweiligen Boxen erstellt und versucht die Datenbank abzufragen nach den Bildern mit dem höchsten Voting der Woche, Monats, Jahres.
Ich hab festgestellt das meine Abfrage nicht funktioniert denn ein Bild das ein Voting mit 5/5 bei einer Stimme (Wert 10000) hat steht in der Rangliste vor dem Bild das 5/5 bei zwei Stimmen (Wert 10000) und sogar vor dem Bild das z.B. 4.7/5 bei drei Stimmen (Wert 6000) hat. Aber die Galerie das richtige Bild als          "bestes Bewertete" anzeigt.
Welchen Fehler mache ich bei der Abfrage oder stimmt meine Berechnungsgrundlage nicht oder hat jemand für mich ein Plugin ???
Bitte um Hilfe.

Besten Dank im Voraus
Gruß
Kai-Uwe
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: Αndré on December 22, 2008, 04:02:05 pm
Zeig uns doch mal deine SQL-Abfrage. Um das Problem:
Ich hab festgestellt das meine Abfrage nicht funktioniert denn ein Bild das ein Voting mit 5/5 bei einer Stimme (Wert 10000) hat steht in der Rangliste vor dem Bild das 5/5 bei zwei Stimmen (Wert 10000)
zu umgehen, kannst du deine Sortierung anpassen:
Code: [Select]
ORDER BY pic_rating, votes DESC
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: kaiwahn on December 22, 2008, 04:24:28 pm
// Ausgabe für das 'Bild der Woche'
$bow_p = $db->query("
SELECT *
FROM ".$mybb->settings['cpg_bestof_prefix']."pictures
WHERE ctime > $fow AND ctime < $low
ORDER BY pic_rating, votes DESC
LIMIT 0,1
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: kaiwahn on December 22, 2008, 04:41:04 pm
// Ausgabe für das 'Bild der Woche'
$bow_p = $db->query("
SELECT *
FROM ".$mybb->settings['cpg_bestof_prefix']."pictures
WHERE ctime > $fow AND ctime < $low
ORDER BY pic_rating, votes DESC
LIMIT 0,1
die Rechnung lautet : Wert 'pic_rating' X Wert 'votes' / 2000 --- Beispiel 9333 X 3 / 2000 = 13995
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: Αndré on December 22, 2008, 05:57:20 pm
die Rechnung lautet : Wert 'pic_rating' X Wert 'votes' / 2000 --- Beispiel 9333 X 3 / 2000 = 13995
Diese Rechnung kann ich in deiner Abfrage nicht sehen. Das Ergenis deiner Beispielrechnung wäre übrigens 13,9995

Ich nehme mal an, dass du jetzt die SQL-Abfrage dafür haben möchtest:
Code: [Select]
$bow_p = $db->query("
SELECT *, pic_rating * votes / 2000 AS top_rated
FROM ".$mybb->settings['cpg_bestof_prefix']."pictures
WHERE ctime > $fow AND ctime < $low
ORDER BY top_rated DESC
LIMIT 0,1

Ist es das, was dir gefehlt hat ???
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: kaiwahn on December 27, 2008, 04:55:57 pm
Vielen Dank für diese Lösung, leider gibt es noch ein paar Probleme im Gesamtergebnis für die Definitionen der Suchergebnisse "Sortierung und Auswahl", hat jemand eine funktionierende Lösung ??
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: Αndré on December 27, 2008, 07:18:25 pm
Vielleicht solltest du dein Problem mal genauer beschreiben und ggf. auch Links untermalen. Um was für Suchergebnisse gehts es denn und wo soll man die finden?
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: thesquid on December 29, 2008, 01:15:01 am
Hallo,

ich klink' mich hier 'mal ein, da ich Kai-Uwe ein wenig (und so gut ich kann) unterstütze; die o. g. Query ist 'auf meinem Mist gewachsen' - für die Hilfe auch von mir noch einmal vielen Dank.

Eine unserer weiteren Ideen ist, ein 'Bild der Woche' zu ermitteln. Hierfür sollen alle Bilder, die innerhalb einer Kalenderwoche hochgeladen und bewertet wurden, sortiert werden.

Bislang gibt es folgende Query:

Code: [Select]
...
// Kalenderwoche ermitteln
$cw_now = date('W', time());

$bow_cw = $db->query("
SELECT
*,
UNIX_TIMESTAMP(mtime) AS mtime,
pic_rating * votes / 2000 AS top_rated
FROM ".$mybb->settings['cpg_bestof_prefix']."pictures
ORDER BY top_rated DESC
LIMIT 0,1
");

while ($sel_cw = $db->fetch_array($bow_cw)) {
$bow_pid = $sel_cw['pid'];
$bow_t = $sel_cw['mtime'];
$bocw = date('W', $sel_cw['mtime']);
}
...

Bis hierhin sind alle Ergebnisse ok - i. M. scheitere ich daran, die zum Bild 'gehörende' Kalenderwoche aus 'mtime' auszulesen und in der Abfrage (evtl. als WHERE-Klausel?) mit der akt. KW (= $cw_now) zu vergleichen. Über die Google-Suche finde ich (natürlich) viele Tipps, allerdings fehlt mir der letzte (richtige) 'Kick'.

Für weiterführende Anstöße bin ich dankbar...

...Gruß
thesquid
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: Αndré on December 29, 2008, 07:50:13 am
Zur Wochenproblematik habe ich mir irgendwann mal den Kopf zerbrochen und bin auf folgendes Ergebnis gekommen:
Code: [Select]
$lastmonday = time()-(date('N')+6)%7*86400;
$nextsunday = time()-(date('N')-7)*86400;

Deinen Code würde ich dann folgendermaßen abändern:
Code: [Select]
$lastmonday = time()-(date('N')+6)%7*86400;
$nextsunday = time()-(date('N')-7)*86400;

$bow_cw = $db->query("
SELECT
*,
UNIX_TIMESTAMP(mtime) AS mtime,
pic_rating * votes / 2000 AS top_rated
FROM ".$mybb->settings['cpg_bestof_prefix']."pictures
WHERE mtime BETWEEN $lastmonday AND $nextsunday
ORDER BY top_rated DESC
LIMIT 0,1
");

while ($sel_cw = $db->fetch_array($bow_cw)) {
$bow_pid = $sel_cw['pid'];
$bow_t = $sel_cw['mtime'];
$bocw = date('W', $sel_cw['mtime']);
}
wobei
Code: [Select]
WHERE mtime > $lastmondayeigentlich auch reichen sollte, da die aktuell und in der nahen Zukunft hochgeladenen Bilder ja auch zur selben Woche gehören.


Falls ich jetzt Murks geschrieben habe, verzeiht mir bitte - es ist noch früh am Morgen :)
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: thesquid on December 29, 2008, 09:37:45 pm
Hallo,

...und vielen Dank für den Input. Leider greift das Konstrukt nicht (richtig).

Ich habe einmal zur Query
Code: [Select]
...
$lastmonday = time()-(date('N')+6)%7*86400;
$nextsunday = time()-(date('N')-7)*86400;

$bow_cw = $db->query("
SELECT
*,
UNIX_TIMESTAMP(mtime) AS mtime,
pic_rating * votes / 2000 AS top_rated
FROM ".$mybb->settings['cpg_bestof_prefix']."pictures
WHERE mtime > $lastmonday
ORDER BY top_rated DESC
LIMIT 0,1
");

while ($sel_cw = $db->fetch_array($bow_cw)) {
$bow_pid = $sel_cw['pid'];
$bow_t = $sel_cw['mtime'];
$bocw = date('W', $sel_cw['mtime']);
}
...

die Inhalte der Variablen und die Ergebnisse in Teilschritten mit ausgegeben:
Quote
1. time() = 1230580362
2. date('N') = 1
3. (date('N')+6) = 7
4. (date('N')+6)%7 = 0
5. (date('N')+6)%7*86400 = 00

>>> $lastmonday = time()-(date('N')+6)%7*86400
>>> = time() = 1230580362

aktueller/letzter Montag - timestamp (" $lastmonday ") = 1230580362
aktuelles Datum (" date('d.m.Y - H:i:s', $lastmonday) ") = 29.12.2008 - 20:52:42
aktuelle Kalenderwoche (" date('W', $lastmonday) ") = 01

--------------------------------------------------------------------------------

1. time() = 1230580362
2. date('N') = 1
3. (date('N')-7) = -6
4. (date('N')-7)*86400 = -518400

>>> $nextsunday = " time()-(date('N')-7)*86400 " = " time()-(-518400) " =
>>> $nextsunday = 1231098762

nächster Sonntag - timestamp (" $nextsunday ") = 1231098762
nächstes Datum (" date('d.m.Y - H:i:s', $nextsunday) ") = 04.01.2009 - 20:52:42
nächste Kalenderwoche (" date('W', $nextsunday) ") = 01

Die Abfrage liefert dann folgendes Ergebnis:
Quote
Bild-ID (" $bow_pid ") = 2
timestamp aus 'mtime' (" $bow_t "): 1229721920
Datum aus 'mtime' (" date('d.m.Y - H:i:s', $bow_t) "): 19.12.2008 - 22:25:20
KW aus 'mtime' (" $bocw "): 51
d. h., der 'mtime'-Wert des Bildes ist kleiner als "$lastmonday ( 1230580362 )" und dennoch wird das Bild ausgegeben.


Dazu zwei Fragen:
- wo liegt der/mein Fehler?
- welche Bedeutung hat der Wert/Parameter " %7 "?


btw: bei Verwendung von "WHERE mtime BETWEEN $lastmonday AND $nextsunday" wird kein einziges Bild selektiert.
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: Αndré on December 29, 2008, 09:59:41 pm
- welche Bedeutung hat der Wert/Parameter " %7 "?
siehe http://de.wikipedia.org/wiki/Modulo


Ich zerbrech mir morgen mal den Kopf darüber, weshalb das nicht funktioniert.
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: thesquid on January 05, 2009, 11:55:50 pm
Hallo,

...und allen hier im Forum ein Gutes Neues Jahr 2009.


siehe http://de.wikipedia.org/wiki/Modulo

Vielen Dank, wieder etwas gelernt. ;)


Ich zerbrech mir morgen mal den Kopf darüber, weshalb das nicht funktioniert.

hast du - oder gern auch jede(r) andere(r) - vllt. noch eine Idee bzw. einen Tipp für mich/uns?


...Gruß
thesquid
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: Αndré on January 06, 2009, 08:38:43 am
Kleiner Fehler bei dem von mir veröffentlichten Code.

Die Variable $lastmonday enthält natürlich den Zeitstempel des Montags der laufenden Woche mit der aktuellen Uhrzeit. Ich selbst verarbeite nur den Wochentag in meinem Code weiter:
Code: [Select]
date("d",$lastmonday)

Du benötigst ja aber den Zeitraum von Montag 00:00:00 bis Sonntag 23:59:59. Diesen musst du dir dann noch errechnen:
Code: [Select]
$lastmonday0 = mktime(0,0,0,date("n",$lastmonday),date("j",$lastmonday),date("Y",$lastmonday));
Deine SQL-Abfrage sieht dann folgendermaßen aus:
Code: [Select]
SELECT
*,
UNIX_TIMESTAMP(mtime) AS mtime,
pic_rating * votes / 2000 AS top_rated
FROM ".$mybb->settings['cpg_bestof_prefix']."pictures
WHERE mtime > $lastmonday0
ORDER BY top_rated DESC
LIMIT 0,1

Der Code ist nicht getestet, sollte so aber funktionieren ::)


Warum bei dir ein Bild mit dem Zeitstempel "1229721920" ausgegeben wird, obwohl nur nach Zeitstempeln größer "1230580362" gefiltert wird, ist mir ein Rätsel.
Title: Re: Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
Post by: thesquid on January 06, 2009, 08:07:28 pm
Hallo,

und Danke für den Input.

Leider liefert auch diese Abfrage das gleiche o. g. Ergebnis; d. h. "SELECT ... UNIX_TIMESTAMP(mtime) ..." greift nicht bzw. wird für die Sortierung nicht berücksichtigt.

Erst eine Änderung in der SQL-Abfrage schafft Abhilfe: der 'direkte' Vergleich "WHERE UNIX_TIMESTAMP(mtime) > $lastmonday0" mit

Code: [Select]
$lastmonday0 = mktime(0,0,0,date("n",$lastmonday),date("j",$lastmonday),date("Y",$lastmonday));

in der SQL-Abfrage

Code: [Select]
SELECT
*,
pic_rating * votes / 2000 AS top_rated
FROM ".$mybb->settings['cpg_bestof_prefix']."pictures
WHERE UNIX_TIMESTAMP(mtime) > $lastmonday0
ORDER BY top_rated DESC
LIMIT 0,1

liefert das richtige (gewünschte) Ergebnis. :)
Das erklärt auch, weshalb nur der Wert "top_rated" 'verwendet' und ein "Bild aus alten Zeiten" (das hatte dann die höchste Bewertung) selektiert wurde...

Nochmals vielen Dank für den tollen Support und...


...Gruß
thesquid