[SQL] Joins

27o8

abgemeldet
2 Mai 2006
9.028
933
Moin,
kann man das hier irgendwie in einem Query lösen?


Ich hab 2 Tabellen:
shop_werbung

id int(11) PRIMARY, AUTO INCREMENT
ziel varchar(255)
banner varchar(255)
menge int(15)
reload int(6)
typ int(1) INDEX
sponsor varchar(15)
unbegrenzt int(11)

shop_werbung_reloads
id int(7) INDEX
ip varchar(15)
bis int(10)

Jetzt möchte ich folgende Sachen:
  1. Reload prüfen, das heist ich möchte ohne zweiten query prüfen ob es in shop_werbung einen Banner gibt, wessen `id` noch nicht im Feld `id` in der shop_werbung_reloads und gleichzeitig die `ip` != die IP des Users und `bis` <= time()
  2. Ich möchte mit einem query den ich auf ein Cron auslagere alle Reloads löschen wo `bis` <= time() oder die keinen Banner mehr haben, das heist wo es keinen Eintrag in der shop_werbung mehr gibt, in der `id` = der `id` des eintrags in der shop_werbung_reloads ist.
Vorallem das erste ist mir wichtig mit nur einer Abfrage zu lösen! Mit Joins müsste das gehen, aber mit denen kenne ich mich nicht gut aus :( und die tuts im Netz helfen mir auch nicht weiter.

Gruß
Gremlin
 
Danke ich habe es so angepasst und nun klappt es soweit! Ein Prob habe ich aber noch ;)

Aktuell:
PHP:
$sql_468 = mysql_query("
SELECT 
    werbung.id, 
    werbung.banner, 
    werbung.ziel,
    werbung.unbegrenzt,
    werbung.reload,
    werbung.menge
FROM 
    shop_werbung AS werbung LEFT JOIN 
    shop_werbung_reloads AS reloads ON (reloads.id = werbung.id && reloads.ip = '".$_SERVER['REMOTE_ADDR']."')  
WHERE     
    (werbung.menge >= 1 || werbung.unbegrenzt = 1) &&  
    werbung.typ = 5 && 
    reloads.id IS NULL 
ORDER BY 
    RAND()
LIMIT 1 
") or die(mysql_error());
da wird jetzt aber nicht geprüft ob bis >= time() müsste das dann so sein:

PHP:
$sql_468 = mysql_query("
SELECT 
    werbung.id, 
    werbung.banner, 
    werbung.ziel,
    werbung.unbegrenzt,
    werbung.reload,
    werbung.menge
FROM 
    shop_werbung AS werbung LEFT JOIN 
    shop_werbung_reloads AS reloads ON (reloads.id = werbung.id && reloads.ip = '".$_SERVER['REMOTE_ADDR']."' && bis >= '".time()."')  
WHERE     
    (werbung.menge >= 1 || werbung.unbegrenzt = 1) &&  
    werbung.typ = 5 && 
    reloads.id IS NULL 
ORDER BY 
    RAND()
LIMIT 1 
") or die(mysql_error());

Und ich habe in dem anderen Thread gelesen das du da mysql_fetch_assoc() verwendet hast, sollte ich das hier auch machen? Ich lese ja nur einen Datensatz aus den ich benötige.
Gruß
Gremlin
 
jap sieht so richtig aus... und ob du mysql_fetch_assoc oder was anderes verwendest ist wurscht, irgendwie musst du die daten ja auslesen.

kannst ja auch $daten = mysql_fetch_assoc(mysql_query("der query")); schreiben.
 
Okay,
ich meinte jetzt aber ob mysql_fetch_array() irgendwelche Nachteile gegenüber mysql_fetch_assoc() hat, weil ich nutze bislang immer _array() :)

Gruß
Gremlin
 
Okay,
ich meinte jetzt aber ob mysql_fetch_array() irgendwelche Nachteile gegenüber mysql_fetch_assoc() hat, weil ich nutze bislang immer _array() :)

Gruß
Gremlin

nein hat keine nachteile... _array gibt dir bloss immer alles doppelt zurück. einmal den wert mit numerischen index und einmal mit dem namen der spalte

zb bei _array()
PHP:
[0] = 123
[id] = 123
[1] = banner.jpg
[banner] = banner.jpg
...
bei _assoc()
PHP:
[id] = 123
[banner] = banner.jpg
...

und da ich die nummerische indexe nicht brauche nehm ich eigentlich immer _assoc()