[SQL] Subquerys einer Reloadsperre erledigt

strolch00

redraft.de
ID: 155297
L
21 April 2006
1.684
72
Hallo so nu wollt ich mich auch mal an Subquery versuchen jedoch will es net so wie ich will.

Hier des Query:
PHP:
"SELECT l.id
	                , l.img
	                , l.title
	                , l.reload AS reloadzeit
	                , l.zeit
	                FROM `lightbanner` AS l
	                WHERE ".time()." > ('SELECT r.reload AS reloadzeiten FROM `lightbannerreload` AS r WHERE r.userid=".$userid."') AND l.uebrig > 0
	                GROUP BY l.id
	                ORDER BY l.verguetung DESC
	                LIMIT 0, 10"

ich will damit diese Code vereinfachen:

PHP:
		 $connect = mysql_query("SELECT id, img, title, reload, zeit FROM `lightbanner` WHERE uebrig > 0 ORDER BY rand() DESC LIMIT 0,10");
		 while ( $zeile = mysql_fetch_object($connect))
		 	{
			 $bannerid = $zeile->id;
			 $userid = userdata("id");
			 $reloadzeile = mysql_fetch_object(mysql_query("SELECT reload FROM lightbannerreload WHERE bannerid=". quote_smart($bannerid)." && userid=". quote_smart($userid)));
			 $reload = $reloadzeile->reload;
			 $time = time();
			 if ( $reload < $time )
			 	{
				 $img = $zeile->img;
				 $title = $zeile->title;
				 $beschr = $zeile->beschr;
				 $reload = $zeile->reload;
				 $zeit = $zeile->zeit;
     mysql_query("DELETE FROM `bannerreload` WHERE `reload` <= '".$time."'");
				 include("templates/lightbanner.tpl");

				}
			}

jedoch bringt der mir immer wieder die höchstvergütetsten banner an obwohl die in der Reload drin sind was ich ja eigentlich mit meinem Subquery ausschließen wollte.

Ich hoffemal jemand kennt ne Lösung.

Ich hatte es auch mit JOIN versucht aber ich habe in der reload tabelle keinen eindeutigen Bezug den ich als KEY nehmen könnte.

Danke
 
Zuletzt bearbeitet:
Hmm ne, das kann so nicht klappen. Du bekommst ja in dem Subquerry alle Reloadzeiten aller geklickten Banner des Users wieder.

Versuch es mal mit der Bedingung:

PHP:
WHERE l.id IS NOT IN ('SELECT r.id AS id FROM `lightbannerreload` AS r WHERE r.userid=".$userid." AND ".time()." < r.reload')

Also alle Banner, deren id nicht mit der id des Usern in der Reloadtabelle steht und bei denen reload kleiner als Zeit ist.

Gruß, Zera
 
danke zera für die flinke antwort aber es funktioniert leider auch nicht

da bekomme ich einen error

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'IN ('SELECT r.id AS id FROM `lightbannerreload` AS r WHERE r.us
 
strolch00 schrieb:
danke zera für die flinke antwort aber es funktioniert leider auch nicht

Versuch erstmal nur das Subquery. Gibt dir das alle Banner-ids aus, die für den User im Reload sind?

PHP:
SELECT r.id AS id FROM `lightbannerreload` AS r WHERE r.userid=".$userid." AND ".time()." < r.reload'

Gruß, Zera
 
jap mit dem richtigen Operator bringt es mit die ID´s in der tabelle.

PHP:
SELECT r.id AS id FROM `lightbannerreload` AS r WHERE r.userid=".$userid." AND ".time()." > r.reload

mir den ID´s kann ich aber nix anfangen du meinst sicher die Bannerid´s richtig
 
strolch00 schrieb:
du meinst sicher die Bannerid´s richtig

Genau. In der Reloadtabelle hast du doch (userid, bannerid, reload). reload ist der timestamp, bis zu dem der Banner für den user in der Reloadsperre ist. Oder?

Gruß, Zera
 
strolch00 schrieb:
da bekomme ich einen error

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'IN ('SELECT r.id AS id FROM `lightbannerreload` AS r WHERE r.us

Ach so, du bekommst nen Error. Dachte das Ergebnis ist falsch. ;)

Gehts so?

PHP:
WHERE l.id IS NOT IN (SELECT r.id AS id FROM `lightbannerreload` AS r WHERE r.userid=".$userid." AND ".time()." < r.reload)

Gruß, Zera
 
nein der gleiche fehler wieder den stört das IS NOT IN

ich hab schon gegoogled aber ich geb warscheinlich falsche suchbegriffe ein :(
 
strolch00 schrieb:
nein der gleiche fehler wieder den stört das IS NOT IN

Hmm komisch. Bin mir nicht sicher ab welcher MySQL Version es das gab, aber das dürfte schon was her sein.

Grundsätzlich sollte so aber eine Reloadsperre realisierbar sein.

Gruß, Zera
 
so nochmal nen zusatz ich bin nun bei einem JOIN Query angelangt da mir gesagt wurde Subquery´s funzen erst ab der 5er MySql

hier der aktuelle Querie

PHP:
	     $sql = "SELECT r.reload
		 			, r.bannerid
		 			, r.userid
					, l.img
					, l.id
					, l.title
					, l.reload AS reloadzeit
					, l.zeit
					FROM `lightbanner` AS l
					LEFT JOIN `lightbannerreload` AS r
					ON(r.userid=".$userid.")
					WHERE l.uebrig > 0 AND ".time()." > r.reload AND l.bid=null
					GROUP BY l.id
	                ORDER BY l.verguetung DESC
	                LIMIT 0, 10";

jedoch bringt der mir null resultate :-? so langsam zweifel ich an meiner logik
 
Jaja, du und Logik :p

Also erstens is die Klammer beim ON unnötig, die brauch man nur bei USING, aber das nur nebenbei.

Die ON-Klausel haste auch missbraucht, das was da steht kommt in WHERE

Also würde ich die Where-Klausel so formulieren:
PHP:
"WHERE l.uebrig > 0 AND (".time()." > r.reload OR l.bid=null) AND r.userid=".$userid
Also auf jeden Fall muss noch was übrig sein und die Zeit der Sperre muss vorbei sein, oder aber man steht noch garnet in der Tabelle für die Reloadsperren drinne.

In der On-Bedingung würde ich
PHP:
ON l.bid = r.bannerid
benutzen, denn du brauchst ja keine Daten aus der Reload-Tabelle die garnet zu deinem aktuellen Banner gehören ;)

Hoffe das klappt
 
hi

1. das mit den Klammern war noch ein überbleibsel von USING
2. so hatte ich es auch schon getestet außer der =NULL bedingung
3. bringt es mit trotzdem nen leeres Resultat

hoffe du hast noch mehr Logik für mich ;)
 
strolch00 schrieb:
hoffe du hast noch mehr Logik für mich ;)

Für dich doch immer ;)

1. Was dieses GROUP BY da zu suchen hat is mir schleierhaft, mach des ma raus

2. Die WHERE is noch net ganz logisch
Versuchs mit:
PHP:
"WHERE l.uebrig > 0 AND ((".time()." > r.reload AND r.userid=".$userid") OR l.bid IS NULL)"
Denn wenn kein Eintrag da is gibs auch keine User-ID ;)
 
super fein NU geht es endlich
PHP:
	     $sql = "SELECT r.reload
		 			, r.bannerid
		 			, r.userid
					, l.img
					, l.id
					, l.title
					, l.reload AS reloadzeit
					, l.zeit
					FROM `lightbanner` AS l
					LEFT JOIN `lightbannerreload` AS r
					ON l.id = r.bannerid
					WHERE l.uebrig > 0 AND ((".time()." > r.reload AND r.userid=".$userid.") OR r.bid IS NULL)
	                ORDER BY l.verguetung DESC
	                LIMIT 0, 10";

Deine Logic ist halt wie schon so paar mal meine Rettung ;) thx