Alex: Problem mit Datenbankabfrage

Hallo Leute,ich habe folgendes Problem:

Ich würde gerne für eine Seite meiner Mannschaft immer die zwei aktuellsten folgenden Termine für Spiele anzeigen lassen.

In der Tabelle habe ich einmal "Auswärts" für die Auswärtsmannschaft und "Heim" für das Heimteam.

Da ich ja jetzt sowohl nach dem Heim- als auch nach dem Auswärtsteam filtern will (Beide Male wäre es bspw. "Herren 2") und gleichzeitig nach dem Datum,d.h. es soll kein Termin dastehen,der schon vorbei ist,habe ich folgende Abfrage geschrieben:

$sql="SELECT DATE_FORMAT(Datum, '%d.%m.%Y') AS Changedatum, TIME_FORMAT(Uhrzeit, '%H.%i') AS Changezeit, Heim, Aus FROM $tabellenname WHERE Heim = 'Herren 2' OR Aus = 'Herren 2' AND Datum>=NOW() LIMIT $limit";

wobei limit=2

ist.

Aber irgendwie haut das nicht hin,es werden auch Termine angezeigt,die nicht mehr aktuell sind.

Was ist der Fehler und wie kann ich ihn beheben?

Vielen Dank im vorraus

  1. Hallo Alex!

    $sql="SELECT DATE_FORMAT(Datum, '%d.%m.%Y') AS Changedatum, TIME_FORMAT(Uhrzeit, '%H.%i') AS Changezeit, Heim, Aus FROM $tabellenname WHERE Heim = 'Herren 2' OR Aus = 'Herren 2' AND Datum>=NOW() LIMIT $limit";

    Aber irgendwie haut das nicht hin,es werden auch Termine angezeigt,die nicht mehr aktuell sind.

    Also, probiers dochmal, indem Du für den Datumsvergleich ein konkretes Datum einsetzt, vielleicht klappt ja was mit dem Datumsvergleich zwischen gespeichertem Wert und NOW() nicht.

    Ansonsten wäre es vielleicht noch sinnvoll, die Datensätze mit ORDER BY Datum ASC zu sortieren, damit auch sicher die beiden nächsten spiele angezeigt werden.

    MfG
    Götz

    --
    Losung und Lehrtext für Sonntag, 29. Februar 2004
    Des Herrn Augen schauen alle Lande, dass er stärke, die mit ganzem Herzen bei ihm sind. (2.Chronik 16,9)
    Wie überschwänglich groß ist seine Kraft an uns, die wir glauben, weil die Macht seiner Stärke bei uns wirksam wurde, mit der er in Christus gewirkt hat. (Epheser 1,19-20)
    (http://www.losungen.de/heute.php3)
    1. $sql="SELECT DATE_FORMAT(Datum, '%d.%m.%Y') AS Changedatum, TIME_FORMAT(Uhrzeit, '%H.%i') AS Changezeit, Heim, Aus FROM $tabellenname WHERE Heim = 'Herren 2' OR Aus = 'Herren 2' AND Datum>=NOW() LIMIT $limit";

      wie schon gesagt,haut nicht hin.mache ich hier einen fehler??

      Also, probiers dochmal, indem Du für den Datumsvergleich ein konkretes Datum einsetzt, vielleicht klappt ja was mit dem Datumsvergleich zwischen gespeichertem Wert und NOW() nicht.

      hab ich auch versucht,haut auch nicht hin,ich habe den eindruck er sucht sich die daten willkürlich raus

      Ansonsten wäre es vielleicht noch sinnvoll, die Datensätze mit ORDER BY Datum ASC zu sortieren, damit auch sicher die beiden nächsten spiele angezeigt werden.

      auch net geklappt.

      hilfe

  2. yo,

    Aber irgendwie haut das nicht hin,es werden auch Termine angezeigt,die nicht mehr aktuell sind.

    erst einmal fehlt ein ORDER BY nach datum sortiert, was dir aber schon gesagt wurde. das andere ist, was zeigt den die funktion NOW() für ein datum an. lass es dir doch mal ausgeben.

    Ilja

  3. Hallo,

    $sql="SELECT DATE_FORMAT(Datum, '%d.%m.%Y') AS Changedatum, TIME_FORMAT(Uhrzeit, '%H.%i') AS Changezeit, Heim, Aus FROM $tabellenname WHERE Heim = 'Herren 2' OR Aus = 'Herren 2' AND Datum>=NOW() LIMIT $limit";

    Aber irgendwie haut das nicht hin,es werden auch Termine angezeigt,die nicht mehr aktuell sind.

    Was ist der Fehler und wie kann ich ihn beheben?

    Da ist ein Operator-Rangfolgen-Fehler. Die Operation AND ist höherwertiger als die Operation OR und wird deshalb zuerst ausgeführt, genau wie Multiplikation von Addition ausgeführt wird.

    SELECT DATE_FORMAT(Datum, '%d.%m.%Y') AS Changedatum, TIME_FORMAT(Uhrzeit, '%H.%i') AS Changezeit, Heim, Aus FROM Tabelle
    WHERE Heim = 'Herren 2' OR Aus = 'Herren 2' AND Datum>=NOW();

    beinhaltet alle Datensätze, bei denen Heim = 'Herren 2' ODER für die gilt: Aus = 'Herren 2' AND Datum>=NOW(), also auch die Datensätze, bei denen Heim = 'Herren 2' und das Datum egal ist.

    Du musst hier Klammern setzen:

    SELECT DATE_FORMAT(Datum, '%d.%m.%Y') AS Changedatum, TIME_FORMAT(Uhrzeit, '%H.%i') AS Changezeit, Heim, Aus FROM Tabelle
    WHERE (Heim = 'Herren 2' OR Aus = 'Herren 2') AND Datum>=NOW();

    viele Grüße ;-))

    Axel