[MySQL] Einträge im aktuellen Zeitbereich auslesen

glowhand

Programmierer
21 April 2006
273
16
Moin, moin,
ich mal wieder mit einem Problem:
In der Tabelle wird Bannerkampagne inklusive Start-Stunde und End-Stunde gespeichert... Nun soll an Hand von der aktuellen Stunde (date('G',time())) eine Kampagne ausgelesen werden... sieht bei mir so aus:
PHP:
$mysql->query("SELECT id,subject,url,img_url,html_code,width,height,views_remaining 
                   FROM %prefix%_banner_campaigns 
                  WHERE (views_remaining > 0 
                     OR clicks_remaining > 0)    
                    AND (IF (start_hour<=end_hour,'(%d BETWEEN start_hour AND end_hour)','1=1')) 
                    AND (IF (start_hour>end_hour,'(%d >= start_hour OR %d <= end_hour)','1=1')) 
                    AND active = %d 
                  ORDER BY last_view_time 
                  LIMIT 1", 
                 array(date('G',time()), 
                       date('G',time()), 
                       date('G',time()), 
                       1));
Das Problem sind diese 2 IF-Abfragen, die funktionieren nicht so, wie sie sollen.
Vielleicht weiß auch hier jemand Rat?
 
Was für eine PHP-Klasse benutzt du denn, um die Abfrage zu machen?
Was genau heißt: "nicht so wie sie sollen"?
Erfolgt die Ersetzung der Werte richtig?

Du könntest auf jeden Fall die beiden IF-Abfragen zu einer Zusammenfassen:
PHP:
IF (start_hour<=end_hour,'(%d BETWEEN start_hour AND end_hour)','(%d >= start_hour OR %d <= end_hour)')
Aber ich glaube nicht, dass hier das Problem liegt.

Versucht mal eine stark vereinfachte Version:
PHP:
SELECT id FROM %prefix%_banner_campaigns 
WHERE IF (start_hour<=end_hour,'(%d BETWEEN start_hour AND end_hour)','(%d >= start_hour OR %d <= end_hour)')
Bekommst du damit Ergebnisse? Wenn nicht, wie genau sieht der SQL-Befehl dann wirklich aus? Und was sagt z.B. MySQL Query Browser (oder PHPMyAdmin). Gibts ne Fehlermeldung?

Noch ne Idee: Versuch mal den BETWEEN-Teil durch größer und kleine zu ersetzen.
 
Was für eine PHP-Klasse benutzt du denn, um die Abfrage zu machen?
- einse selbst geschriebene, die einfach nur die variablenwerte des übergebenen arrays in der query einfügt, ein mysql_query macht, darauf ein mysql_fetch_assoc... Da sollte kein Fehler liegen
Was genau heißt: "nicht so wie sie sollen"?
oh habe ich ganz vergessen zu erwähnen^^ es werden nicht alle einträge ausgelesen. also eigentlich keiner ;)
Erfolgt die Ersetzung der Werte richtig?
es soll nichts ersetzt, sondern nur ausgelesen werden. und ob da oben ein update oder select steht sollte ja kein rolle spielen, weil der fehler ja bei den if-abfragen liegt (ohne den if-abfragen funktioniert es).
Du könntest auf jeden Fall die beiden IF-Abfragen zu einer Zusammenfassen:
danke, hab ich gemacht. aber es bleibt dabei :(
Versucht mal eine stark vereinfachte Version:
schon versucht, es liegt wirklich an der if-abfrage.
Wenn nicht, wie genau sieht der SQL-Befehl dann wirklich aus?
ja, habe ich doch oben gepostet^^. das %d ist immer mit der aktuellen stunde ersetzt und das %prefix% mit dem Tabellen-Prefix.
Noch ne Idee: Versuch mal den BETWEEN-Teil durch größer und kleine zu ersetzen.
bereits erfolgslos versucht.
 
Das funktioniert freilich nicht, weil dieses komisches Zeugs im IF natürlich Zeichenkettenliterale sind und folglich niemals ausgeführt werden.
 
das erklärt einiges ;)
hast du eine idee, wie die abfrage sonst aussehen könnte?
 
Wenn ich verstehen würde, was die Abfrage machen soll, könnte ich dir helfen ;)

So wie ich das sehe, hast du ja 3 Teile, die unterschiedlich ausgewertet werden sollten (was ja so ned geht, wie du das dir vorstellt):
  • 1=1
  • %d BETWEEN start_hour AND end_hour
  • %d >= start_hour OR %d <= end_hour
Ein bisschen Algebra und du formst das System zu
  • true
  • %d >= start_hour AND %d <= end_hour
  • %d >= start_hour OR %d <= end_hour
um.

Und jetzt - ohne, dass ich weiß, was du haben willst - seh ich, dass die erste Zeile die beiden unteren Zeilen implizieren und die zweite Zeile die dritte Zeile impliziert.

D.h., wenn ich keinen Denkfehler drin hab, müsste es doch reichen, wenn du nur die unterste Zeile für alle Fälle nimmst. Kommt dann das richtige raus ?
 
Naja, ein Sponsor kann Bannerkampagnen eintragen und wählt, neben URL, Bild-URL , Anzahl Views auch eine Werbezeit: von wann bis wann soll der Banner angezeigt werden?
Die Anfangsstunde ist start_hour, die Endstunde ist end_hour.
Nun soll bei jedem Seitenaufruf ein Banner ausgelesen werden... Dazu muss überprüft werden, ob der Banner im aktuellen Zeitbereich liegt... Also wenn es 7 Uhr ist, kann deshalb kein Banner von 9 bis 12 Uhr angezeigt werden.
An sich wäre es ja einfach: Überprüfen, ob Startstunde kleiner/gleich als aktuelle Stunde und Endstunde größer/gleich als aktuelle Stunde ist.
Nur würde das nicht hinhauen, wenn die Startstunde zB 22 Uhr ist und die Endstunde 4 Uhr... Startstunde wär ja dann größer als Endstunde...
 
Achso. Mach ne disjunktive Normalform ;)
Code:
[FONT=Courier New]...
[B][COLOR=#9932cc]WHERE[/COLOR][/B]
  ((start_hour <= end_hour) [B][COLOR=#9932cc]AND[/COLOR][/B] (%d [B][COLOR=#9932cc]BETWEEN[/COLOR][/B] start_hour [B][COLOR=#9932cc]AND[/COLOR][/B] end_hour))
  [B][COLOR=#9932cc]OR[/COLOR][/B]
  ((start_hour > end_hour) [B][COLOR=#9932cc]AND[/COLOR][/B] (%d >= start_hour [B][COLOR=#9932cc]OR[/COLOR][/B] %d <= end_hour))[/FONT]
...müsste stimmen.