Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen
 

News:

CPG Release 1.6.26
Correct PHP8.2 issues with user and language managers.
Additional fixes for PHP 8.2
Correct PHP8 error with SMF 2.0 bridge.
Correct IPTC supplimental category parsing.
Download and info HERE

Main Menu

Datenbankabfrage um Bilder der Woche, des Monats, des Jahres abzufragen

Started by kaiwahn, December 22, 2008, 03:58:27 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

kaiwahn

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

Αndré

Zeig uns doch mal deine SQL-Abfrage. Um das Problem:
Quote from: kaiwahn on December 22, 2008, 03:58:27 PM
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:
ORDER BY pic_rating, votes DESC

kaiwahn

// 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

kaiwahn

Quote from: 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
die Rechnung lautet : Wert 'pic_rating' X Wert 'votes' / 2000 --- Beispiel 9333 X 3 / 2000 = 13995

Αndré

Quote from: kaiwahn on December 22, 2008, 04:41:04 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:
$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 ???

kaiwahn

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 ??

Αndré

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?

thesquid

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:

...
// 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

Αndré

Zur Wochenproblematik habe ich mir irgendwann mal den Kopf zerbrochen und bin auf folgendes Ergebnis gekommen:
$lastmonday = time()-(date('N')+6)%7*86400;
$nextsunday = time()-(date('N')-7)*86400;


Deinen Code würde ich dann folgendermaßen abändern:
$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
WHERE mtime > $lastmonday
eigentlich 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 :)

thesquid

Hallo,

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

Ich habe einmal zur Query

...
$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.

Αndré

Quote from: thesquid on December 29, 2008, 09:37:45 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.

thesquid

Hallo,

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


Quote from: eenemeenemuu on December 29, 2008, 09:59:41 PM
siehe http://de.wikipedia.org/wiki/Modulo

Vielen Dank, wieder etwas gelernt. ;)


Quote from: eenemeenemuu on December 29, 2008, 09:59:41 PM
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

Αndré

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:
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:
$lastmonday0 = mktime(0,0,0,date("n",$lastmonday),date("j",$lastmonday),date("Y",$lastmonday));

Deine SQL-Abfrage sieht dann folgendermaßen aus:
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.

thesquid

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


$lastmonday0 = mktime(0,0,0,date("n",$lastmonday),date("j",$lastmonday),date("Y",$lastmonday));


in der SQL-Abfrage


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