Komplexe DB abfrage oder?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Komplexe DB abfrage oder?

    Hallo Leute
    ich brauche mal eure Hilfe.

    Ein Kunde von mir veranstaltet Events. Diese sind in einer Datenbank (MySQL) gepeichert und werden über PHP ausgegeben.
    Die DB enthält ein Feld 'tag' in diesem ist der Timestamp des Veranstaltungstages gespeichert.

    Nun möchte ich folgende Augabe erzeugen:
    die Ausgabe soll immer die aktuellsten Parties anzeigen und zwar bis zu 14 stück. Wenn aber nur 8 da, dann sollen auch nur 8 angezeigt werden.
    Das heisst es sollen minimum 8 anzeigt werden, maximal 14 .
    Wenn es also nur 6 neue Veranstaltungen gibt (neue = heutiger Tag oder in der Zukunft) sollen noch die beiden letzten alten Veranstaltungen anzeigt werden um auf die 8 zu kommen usw..
    Oh man mir fällt es schon schwer das so in Worte zu fassen?

    Mein Ansatz:
    PHP-Code:
    $result mysql_query ("SELECT * FROM `veranst1` WHERE tag >= $timestamp ORDER by tag LIMIT 14",$db);
    if (
    mysql_errno()) die ("MySQL-Error: " mysql_error());
    $ergebnis mysql_query($abfrage); 
    while (list (
    $id ,$... $preis) = mysql_fetch_row ($result))

    So werden mir die nächsten 14 Veranstaltungen angezeigt.
    Aber wie bekomme ich es hin mit den min. 8 und den dann auch möglichen alten Einträgen?

    Dank an alle die sich mit dem Problem befassen!
    @dd Internet Webservice
    Rosenwinkel 22, 22607 Hamburg
    Tel: 040 / 320 34 579 Mail:skieck@yahoo.com, Web: http://www.add-internet.de
    Kursprogramm unter:
    http://www.add-internet.de/kursunterlagen/Kursangebot.pdf

  • #2
    Hallo,

    ich würde mit
    Code:
    SELECT * FROM `veranst1` ORDER by tag desc LIMIT 14
    erstmal die 14 aktuellsten aus der DB holen. Wenn du die dann durchiterierst, kannst du mit PHP leicht feststellen, ob nach den ersten 8 Datensätzen noch welche kommen, die aktuell sind. Wenn das so ist, gibst du sie ebenfalls aus, wenn nicht [FONT="Courier New"]break;[/FONT]

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Amica, ich denke dein Vorschlag wird nicht gehen - weil, so wie ich die Aufgabenstellung verstehe, auch jetzt schon vierzehn Silvesterparties eingetragen sein können, und wenn du dann nur die 14 Veranstaltungen mit dem höchsten Timestamp selektierst, dann lieferst du mir bei meiner heutigen Anfrage eben diese Silvesterparties, obwohl ich natürlich erst mal an den Events interessiert wäre, die nächste Woche stattfinden.

      Es ist aber ein Interval um einen beliebigen Zeitpunkt herum gefragt.
      Und wenn man die Grenzen dieses Intervals nicht vorher über ihren Wert definieren kann, sondern nur über die Anzahl - dann braucht man zwei einzelne Abfragen.

      Eine, die von jetzt an die nächsten 14 Veranstaltungen (timestamp >= NOW(), ORDER BY timestamp ASC) heraussucht, und eine, die die 8 letzten, vergangenen Veranstaltungen (timestamp < NOW(), ORDER BY timestamp DESC) liefert.

      Die kann man dann in eine UNION stecken, und deren (sortiertes) Ergebnis ggf. auch noch mal einem LIMIT unterziehen.


      (Und wenn man, entgegen allen Gesetzen der Vernunft, noch keinen Index auf seiner timestamp-Spalte liegen hat, dann besorgt man sich schnellstens einen ;-)
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        PHP-Lösung

        Eine simple Lösung mit PHP:

        PHP-Code:
        $result = array();

        $l_DBQuery 'SELECT * FROM veranst1 WHERE tag >= {TODAY} ORDER BY tag ASC LIMIT 14';
        $l_DBResult mysql_query$l_DBQuery );

        $_numRows mysql_num_rows$l_DBResult );

        while (
        $l_Row mysql_fetch_row$l_DBResult ) ) {
         
        array_push$result$l_Row );
        }

        if( 
        $_numRows 14 ) {
            
            
        $_limit 14 $_numRows
            
        $l_DBQuery 'SELECT * FROM veranst1 WHERE tag < {TODAY} ORDER BY tag DESC LIMIT ' $_limit;

            
        $l_DBResult mysql_query$l_DBQuery );

            while (
        $l_Row mysql_fetch_row$l_DBResult ) ) {
                
        array_push$result$l_Row );
            }
        }

        arsort$result ); 
        {TODAY} steht für die geeignete Funktion zur Ermittlung des Zeitpunktes, um den herum gruppiert werden soll.

        @wahsaga: IMHO erzeugt der UNION-Konstrukt die Komplementärmenge der max. nächsten 14 und der max. letzten 8 Ergebnisse, im schlechtesten Fall also 22, ohne die Möglichkeit, die Ergebnisse in der geforderten Anzahl um den Referenzzeitpunkt zu gruppieren.

        GZ,

        Ron

        Kommentar


        • #5
          @code-kobold: Union erzeugt die Vereinigungsmenge, die Komplementärmenge kann man nur mit einer NOT-IN-verknüpften Unterabfrage bilden.

          Mit
          Code:
          select * from veranst1 where tag >= curdate() order by tag limit 14
          union
          (select * from veranst1 where tag < curdate() order by tag desc limit 8)
          order by tag desc limit 14
          kommt man im schlimmsten Fall trotzdem auf 14, nicht 22. Dadurch spart man sich eine Abfrage und kann mit PHP anhand des Datums entscheiden, ob nach dem 8. Datensatz noch weitere Datensätze benutzt werden.
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar

          Lädt...
          X