Heinz die Banner anzeigen die er noch nicht gesehen hat (JOIN?)
Hey!
Also folgendes:
Ich habe in meinem MySQL zwei InnoDB-Tabelle:
Tabelle Nummer 1: Banner:
ID | Name
1 |Foo
2 |Bar
3 |FooBar
Tabelle Nummer 2: Reload
User | B_ID | (DATETIME) Until
Heinz | 1 | 2009-02-27 20:15:00
Heinz |2 |2008-01-01 19:30:00
Banner:Reload ist logischerweise 1:m
Gehen wir einfach mal davon aus, dass NOW(); 2009-02-27 19:00:00 ist.
->Heinz ist also für Banner 1 im Reload, sein Reload für Banner 2 ist abgelaufen und für 3 hat er keinen Tupel in der Reload-Tabelle
Wie der Titel schon sagt möchte ich "Heinz" jetzt die Banner anzeigen für die er nicht im Reload ist.
Das heißt:
Es gibt keinen Tupel der Heinz und die BannerID aufweisst, oder der Tupel ist abgelaufen -> TIMEDIFF(NOW(),Reload.Until)>0
Meine Datenbankerfahrung ist zwar eingentlich ganz ordentlich, aber ich krieg's einfach nicht hin....
Er hatte ich einen OUTER-Join im Verdacht, aber der wollte nicht.
Ein INNER kommt ja nicht in Frage, weil keine 1:1 Beziehung.
PS:
Um euch Nachschlagarbeit zu TIMEDIFF zu ersparen:
mysql> SELECT TIMEDIFF('2009-02-27 19:00:00','2009-02-27 18:00:00') AS dif;
+----------+
| dif |
+----------+
| 01:00:00 |
+----------+
Also folgendes:
Ich habe in meinem MySQL zwei InnoDB-Tabelle:
Tabelle Nummer 1: Banner:
ID | Name
1 |Foo
2 |Bar
3 |FooBar
Tabelle Nummer 2: Reload
User | B_ID | (DATETIME) Until
Heinz | 1 | 2009-02-27 20:15:00
Heinz |2 |2008-01-01 19:30:00
Banner:Reload ist logischerweise 1:m
Gehen wir einfach mal davon aus, dass NOW(); 2009-02-27 19:00:00 ist.
->Heinz ist also für Banner 1 im Reload, sein Reload für Banner 2 ist abgelaufen und für 3 hat er keinen Tupel in der Reload-Tabelle
Wie der Titel schon sagt möchte ich "Heinz" jetzt die Banner anzeigen für die er nicht im Reload ist.
Das heißt:
Es gibt keinen Tupel der Heinz und die BannerID aufweisst, oder der Tupel ist abgelaufen -> TIMEDIFF(NOW(),Reload.Until)>0
Meine Datenbankerfahrung ist zwar eingentlich ganz ordentlich, aber ich krieg's einfach nicht hin....
Er hatte ich einen OUTER-Join im Verdacht, aber der wollte nicht.
Ein INNER kommt ja nicht in Frage, weil keine 1:1 Beziehung.
PS:
Um euch Nachschlagarbeit zu TIMEDIFF zu ersparen:
mysql> SELECT TIMEDIFF('2009-02-27 19:00:00','2009-02-27 18:00:00') AS dif;
+----------+
| dif |
+----------+
| 01:00:00 |
+----------+
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 110195
Url: https://administrator.de/contentid/110195
Ausgedruckt am: 13.11.2024 um 12:11 Uhr
4 Kommentare
Neuester Kommentar
Das Speicher Problem ist erstmal zweitrangig - Optimierung ist ja immer erst der 2. Schritt - erstmal muss es gehen.
das sollte gehen - und Du sparst dir dieses 'NOT IN' - meine Erfahrung zeigt das es rel. langsam ist und nur bei Konstanten sinn macht.
Der LEFT JOIN gibt alle Einträge aus der 'banner' Tabelle und nur die Eintrage aus der 'reload' Tabelle zurück die die ON Klausel erfüllen, somit sind bei nicht vorhandenen Einträgen, aus der 'reload' Tabelle' NULL Werte eingetragen.
SELECT b.id
FROM
banner b LEFT JOIN (
SELECT b_id FROM reload
WHERE
DATE_ADD(until, INTERVAL 1 HOUR) < NOW() AND
user_id = ?
) tmp ON b.id = tmp.b_id
WHERE
tmp.b_id IS NULL;
das sollte gehen - und Du sparst dir dieses 'NOT IN' - meine Erfahrung zeigt das es rel. langsam ist und nur bei Konstanten sinn macht.
Der LEFT JOIN gibt alle Einträge aus der 'banner' Tabelle und nur die Eintrage aus der 'reload' Tabelle zurück die die ON Klausel erfüllen, somit sind bei nicht vorhandenen Einträgen, aus der 'reload' Tabelle' NULL Werte eingetragen.