Yahoo Clever wird am 4. Mai 2021 (Eastern Time, Zeitzone US-Ostküste) eingestellt. Ab dem 20. April 2021 (Eastern Time) ist die Website von Yahoo Clever nur noch im reinen Lesemodus verfügbar. Andere Yahoo Produkte oder Dienste oder Ihr Yahoo Account sind von diesen Änderungen nicht betroffen. Auf dieser Hilfeseite finden Sie weitere Informationen zur Einstellung von Yahoo Clever und dazu, wie Sie Ihre Daten herunterladen.

Wie kann ich Heinz die Banner anzeigen die er noch nicht gesehen hat (MySQL)?

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 |

+----------+

1 Antwort

Bewertung
  • Anonym
    vor 1 Jahrzehnt
    Beste Antwort

    Ich hoffe, es richtig verstanden zu haben...

    Vorweg, die gewählten Spalten und Tabellennamen sind teilweise reservierte Begriffe und müssen anders gewählt werden! Der Spaltenname 'until' ist ebenso unzulässig wie der Tabellenname 'reload'. Ich verwende also statt 'until' 'ReloadUntil' und statt 'reload' 'breload'. Die Information des Tabellenspeichertyps (InnoDB oder MyISAM oder andere) ist übrigens für die Aufgabenstellung nicht von Bedeutung!

    Das SQL-Statement sähe dann so aus:

    select b.ID, b.BannerName

    from banner AS b

    LEFT OUTER JOIN breload AS br ON br.B_ID=b.ID

    where br.User is null

    or br.ReloadUntil<NOW();

    Ermittelt werden alle Einträge aus der Banner-Tabelle, für die es einen Bezug in der Reload-Tabelle gibt dessen Datum abgelaufen ist oder, für den es eben keinen Bezug in der Reload-Tabelle gibt („br.User is null“ – das funktioniert durch den LEFT OUTER JOIN).

Haben Sie noch Fragen? Jetzt beantworten lassen.