kobinierte abfrage - zeige die, die nicht zutreffen

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

  • kobinierte abfrage - zeige die, die nicht zutreffen

    hallo leute,
    ich bin noch ziemlich neu und am rumprobieren, was abfragen mit sql und php angeht. einfache abfragen kriege ich schon ganz gut hin - aber jetzt stehe ich echt vor einem problem, welches mich schon tagelang beschäftigt und ich keinen lösungsansatz hinbekomme.

    also es geht um eine suche von freien objekten in einem bestimmten zeitraum. einen belegungsplan habe ich mir schon von einem tollen script umgebastelt - aber jetzt will ich nach freien objekten suchen!!

    es gibt folgende tabelle buchung (vereinfachte form - in datum wird dann mit funktion date gerechnet) - datum zeigt die besetzten tage - also z.B. 1 wäre der 1.Mai und 2 der 2.Mai usw.:

    | objekt_id | datum |
    | 401 | 1 |
    | 401 | 2 |
    | 401 | 3 |
    | 401 | 8 |
    | 401 | 9 |
    | 402 | 3 |
    | 402 | 4 |
    | 402 | 5 |
    | 402 | 11 |
    | 402 | 12 |
    | 402 | 11 |
    | 403 | 1 |
    | 403 | 2 |
    | 403 | 3 |
    | 403 | 8 |
    | 403 | 9 |
    | 40X | usw. |


    jetzt möchte ich abfragen, welches objekt in diesem zeitraum besetzt ist - und mir dann alle anderen anzeigen lassen - außer den besetzten.
    wenn jetzt nur das objekt in dem bestimmten zeitraum in der tabelle wäre, ist das kein problem, aber es sind ja auch noch andere zeiten von diesem objekt belegt und diese würden mir ja dann auch angezeigt - das will ich ja gerade nicht !!

    wie muss ich die abfrage stellen?

    bisher habe ich:


    PHP-Code:

    //datum ist hier vereinfacht als zahl dargestellt - also 1 wäre hier der 1.

     
    $start"5";
     
    $ende="8";

    mysql_connect("XXXXX","XXXX","XXXX") or die
      (
    "Keine Verbindung moeglich");
        
    mysql_select_db("XXXX") or die ("Die Datenbank existiert nicht");

     
    $anfrage="
     SELECT * FROM 
     buchung
     WHERE
     datum
     BETWEEN
     '
    $start'
     AND
     '
    $ende'
     GROUP BY objekt_id
     "
    ;

     
    $ergebnis=mysql_query($anfrage);
     
    $anz=mysql_num_rows($ergebnis);
     print (
    "<p><strong>Anzahl der Treffer: </strong>");
     print (
    $anz);
     for (
    $a=$anz-1;$a>-1$a--) {
       
    mysql_data_seek ($ergebnis$a);
       
    $zeile=mysql_fetch_row($ergebnis);
       print (
    "<tr align='center'>");
       print (
    "<td>");
       print (
    "<a href='r1.php?id=");
       print (
    $zeile[0]);
       print (
    "'>");
       print (
    $zeile[0]);
       print (
    "</a>");
       print (
    "</td>");
       print (
    "<td>");
       print (
    $zeile[1]);
       print (
    "</td>");
      }
     print (
    "</table>"); 
    jetzt habe ich alle, die zutreffen - wie werfe ich jetzt alle anderen als ergebnis aus, abzüglich den objekten, die zutreffen?


    wäre super dankbar für eure hilfe

    liebe grüße

    protogue

  • #2
    Du musst die Abfrage auf die Objekt-Tabelle und die Buchstabelle beziehen. Du willst doch alle Objekte haben, die nicht für einen bestimmten Zeitraum nicht in der Buchungstabelle enthalten sind, oder?! Ich kenne deine Objekte-Tabelle nicht, daher hab ich einfach irgendwas angenommen.

    Code:
    SELECT
      objekte.objekt_id
    FROM
      objekte,
      buchung
    WHERE
      objekte.objekt_id = buchung.objekt_id
     AND 
      buchung.datum NOT (BETWEEN '$start' AND '$ende')
    Das wär´s eigentlich.

    PS: Wer einen Fehler findet, darf ihn gerne behalten.
    Ich denke, also bin ich.
    Manche sind trotzdem!

    Kommentar


    • #3
      noch ein denkfehler

      hallo cst,
      danke für die schnelle antwort,
      aber deine abfrage funktioniert so auch nicht!

      das ergebnis wirft mir ja immer noch alle anderen daten des gleichen objektes aus, die nicht im BETWEEN liegen.

      also noch mal zur erklärung. das objekt 401 ist laut tabelle belegt am 1,2,3,8,9.

      wenn ich jetzt im BETWEEN $start= '1' und $ende='3' habe, dann habe ich zwar treffer für das objekt 401 aber im ergebnis wird 401 trotzdem angezeigt, da ja die werte 8 und 9 auch gefunden wurden.

      401 darf jetzt aber nicht auftauchen da treffer im zeitraum - wie kann ich das unterbinden?

      bitte hilfe - ich verzweifele hier

      Kommentar


      • #4
        Dann mach doch zwei Abfragen

        Zuerst die IDs der nicht verfügbaren Objekte ermitteln
        Dann die Objekte ermitteln, deren IDs NOT IN (kommeseparierte IDs der nicht verfügbaren IDs)
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          Ach so....
          ich denke ich hab´s jetzt begriffen. Naja, da kommst du mit SQL nicht wirklich weiter (glaube ich).

          Ok, ich würde die Informationen in einer (HTML-)Tabelle am Bildschirm darstellen (wenn der Platz dazu ausreicht).

          Code:
          März____|_1_|_2_|_3_|_4_|_5_|_6_|_7_|_8_|_9_| ...
          Objekt1 | B | B | B |   |   |   |   | B | B | ...
          Objekt2 |   |   | B | B | B |   |   |   |   | ...  
          Objekt3 |   | B |   |   | B |   |   | B |   | ...  
          ...

          Dazu würde ich nun erstmal eine Liste aller Objekte Bilden.

          PHP-Code:
          mysql_connect("XXXXX","XXXX","XXXX") or die
            (
          "Keine Verbindung moeglich");
              
          mysql_select_db("XXXX") or die ("Die Datenbank existiert nicht");

          $strSQL "SELECT
            objekt_id,
            objekt_name
          FROM
            objekte"
          ;

          $result=mysql_query($strSQL);

          if (!
          $result) { 
              echo 
          "Could not successfully run query ($sql) from DB: " mysql_error(); 
              exit; 



          while (
          $arrRow mysql_fetch_row($result)) {
              
          // irgendwas mit dem Ergebnis machen, falls nötig
              
          $arrObjekte[] = $arrRow;

          So nun schauen wir uns jedes der Objekte für einen bestimmten Zeitraum an. Ich gehe hier nur auf den Tag eines Monats ein,
          wie in deinem Beispiel.


          PHP-Code:

          $start 
          5;
          $ende 8;

          // Tabelle bauen
          echo '<table><tr><td>Monatsname oder so...</td>';
          for (
          $intDay $start$intDay $ende$intDay++) {
              echo 
          "<td>$intDay</td>";
          }
          echo 
          '</tr>';    

          foreach (
          $arrObjekte AS $arrObjekt) {
              
          $strSQL "SELECT * FROM buchung WHERE (datum BETWEEN '$start' AND '$ende') AND objekt_id = $arrObjekt['objekt_id'] GROUP BY datum ORDER BY datum";
              
          $result mysql_query($strSQL);

              
          $arrBelegung = array(); // Array löschen

              
          while ($arrRow mysql_fetch_row($result)) {
                  
          $arrBelegung[$arrRow[datum]] = TRUE;
              }
              
              
          // Ausgabe
              
          echo "<tr><td>$arrObjekt['objekt_name']</td>";
              for (
          $intDay $start$intDay $ende$intDay++) {
                  echo 
          '<td>';
                  if (
          $arrBelegung[$intDay]) {
                      echo 
          'B';
                  } else {
                     
          // Zum Beispiel Link zur Buchung angeben....
                  
          }
                  echo 
          '</td>';
              }
              echo 
          '</tr>';
          }
              
          echo 
          '</table'>; 
          Alles völlig ungetestet. Gibt bestimmt ein paar Syntax und Klammerprobleme. Ich hab´s halt so runtergeschrieben.
          Ich denke, also bin ich.
          Manche sind trotzdem!

          Kommentar


          • #6
            danke cst - aber einen belegungsplan habe ich schon - die user sollen jetzt per formular freie termine suchen können, ohne jedes objekt anklicken zu müssen...

            noch eine andere idee?

            Kommentar


            • #7
              Original geschrieben von mrhappiness
              Dann mach doch zwei Abfragen

              Zuerst die IDs der nicht verfügbaren Objekte ermitteln
              Dann die Objekte ermitteln, deren IDs NOT IN (kommeseparierte IDs der nicht verfügbaren IDs)
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                hallo mrhappyness,

                an deine lösung habe ich auch schon gedacht - aber wie bekomme ich die ids hier rein - zumal das beliebig vielle sein können?

                (kommeseparierte IDs der nicht verfügbaren IDs)

                sicher mit einen array[] - aber wie genau?

                Kommentar


                • #9
                  Original geschrieben von protogue
                  mrhappyness


                  an deine lösung habe ich auch schon gedacht - aber wie bekomme ich die ids hier rein - zumal das beliebig vielle sein können?

                  (kommeseparierte IDs der nicht verfügbaren IDs)

                  sicher mit einen array[] - aber wie genau?
                  indem du die IDs mit mysql_fetch_assoc ausliest und in ein Array packst, das Array wandelst du mit implode in einen String um
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    funzt

                    vielen dank mr. happyness,

                    es funktioniert endlich - dank deinem denkanstoß

                    hier nochmal meine abfragen:

                    PHP-Code:
                    $result mysql_query("SELECT objektid FROM buchen WHERE date BETWEEN '$start' AND '$ende' GROUP BY objektid");

                    while (
                    $row mysql_fetch_array($resultMYSQL_ASSOC)) {
                    $arrayid[]= $row["objektid"];
                    }
                    $comma_separated implode(","$arrayid);

                    $anfrage="SELECT * FROM objekt WHERE id NOT IN ($comma_separated)";

                     
                    $ergebnis=mysql_query($anfrage);
                     
                    $anz=mysql_num_rows($ergebnis); 
                    danke noch mal für eure hilfe

                    Kommentar


                    • #11
                      Re: funzt

                      Original geschrieben von protogue
                      vielen dank mr. happyness
                      Langsam glaube ich, du machst das absichtlich
                      Ich denke, also bin ich. - Einige sind trotzdem...

                      Kommentar


                      • #12
                        ??

                        was soll ich absichtlich machen?

                        Kommentar


                        • #13
                          sorry

                          du meinst deinen nick - sorry - sorry - ist mir entgangen

                          Kommentar

                          Lädt...
                          X