Ankündigung

Einklappen
Keine Ankündigung bisher.

INNER JOIN + Suchkriterien + Abfrage

Einklappen

Neue Werbung 2019

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

  • INNER JOIN + Suchkriterien + Abfrage

    Hallo zusammen!
    Aus einer Inventurverwaltung/Artikelverwaltung soll nach verschiedenen
    Suchkriterien gesucht werden können. Dafür hab ich mehrere Tabellen.

    1) In meiner Haupttabelle a stehen die meisten Datensätze einfach in Form von Strings.
    Also z.B. bei Modell --> FX60 oder Seriennummer --> 4323
    2) Allerdings stehen bei manchen auch nur Zahlen (ID`s), die entsprechenden Bezeichnungen
    finden sich dann in anderen Tabellen.
    Bei mir stehen in den Tabelle b und c die entsprechenden Bezeichnungen (z.B. ID: 5 -->Bezeichnung: Computer)
    für die in Tabelle a eingetragenen ID`s (also a.hop_ID = b.ID und a.hup_ID = c.ID)
    3) Wenn ich mir alle Daten ausgeben lassen will mach ich das so:
    PHP-Code:
       $query_tb_hardwarebestand mysql_query ("
       SELECT e.ID, e.Name, e.Vorname, d.ID, d.Bemerkung, c.hup_Name, c.ID, b.hop_Name, b.ID, a.hop_ID, a.hup_ID, a.Seriennummer, a.Hersteller, a.Modell,
       a.Merkmale, a.StandortID, a.NutzerimotionID
       FROM tb_hardwarebestand AS a INNER JOIN tb_hop AS b
       ON a.hop_ID = b.ID
       INNER JOIN tb_hup AS c ON a.hup_ID = c.ID
       INNER JOIN standorte AS d ON a.StandortID = d.ID
       INNER JOIN nutzerimotion AS e ON a.NutzerimotionID = e.ID"
    ); 
    4) Nun will ich aber eine Suche einbauen, bei der vom User irgendwelche Suchkriterien
    eingegeben werden können, und dann nur die relevanten Datensätze ausgegeben werden.

    Normal würde ich das wohl so machen, da bekomm ich in meinem Fall aber natürlich nur
    die ID`s, nicht aber die zugehörigen Namen:
    PHP-Code:
    $query_server_sql "SELECT * FROM tb_hardwarebestand WHERE ";
        
        if(
    $_POST["hop"] != ""){
            
    $query_server_sql.= "hop_ID LIKE '" $_POST["hop"] . "%' ";
        }
        if(
    $_POST["Modell"] != ""){
            
    $query_server_sql.= "Modell LIKE '" $_POST["Modell"] . "%' ";
        }
        
        if(
    $Seriennummer != ""){
            
    $query_server_sql.= "AND Seriennummer LIKE '" $Seriennummer "%' ";
        }
        [...] 
    Jetzt krieg ichs bloß nicht hin, die beiden Abfragen zu kombinieren.
    Weiß da jemand wie man das richtig ineinander wurschteln könnte?

    Gruß und Dank im Voraus
    duerov


    Nochmal der Übersichtlich kein halber meine Tabellen:

    Tabelle a --> tb_hardwarebestand
    hop_ID
    hup_ID
    Seriennummer
    Modell
    Bemerkung
    ...

    Tabelle b --> tb_hop
    ID
    hop_Name

    Tabelle c --> tb_hup
    ID
    hup_Name

    Tabelle d --> standorte
    Tabelle e --> nutzerimotion

  • #2
    Deine Tabellenstruktur scheint dann aber schon sehr lumpig zu sein, wenn manchmal nichts, manchmal nur IDs und manchmal ganze Artikelnamen drinne stehen.

    Am besten nicht flickschustern sondern gleich richtig machen! Die Mühe lohnt sich.

    Kommentar


    • #3
      Also langsam gehst DU mir auf den Geist. Sobald ein Lösungsansatz dem großen php-Moderator nicht genehm ist wird ohne konstruktive Vorschläge einfach gefordert alles neu zu machen, wie auch immer sich der große Meister die Optimallösung vorstellt. Hallllllloooooooooo, dies ist ein ANFÄNGERforum, da kann es vorkommen, dass nicht die Superlösungsansätze gepostet werden.
      Davon abgesehen solltest du die Artikel genau lesen bevor du deinen Senf dazu gibst. Hab nirgends geschrieben dass in einem Feld nichts drin steht. Und wenn wär das auch egal, soll ja mal vorkommen, dass jemand zu einem Artikel keine Bemerkung schreiben will, sprich das Feld ist leer. Desweiteren find ich die Tabellenstruktur nicht so lumpig. Es lassen sich ohne Probleme weitere Haupt- und Unterpunkte in den entsprechenden Tabellen hinzufügen. Und ich denke mein momentanes Problem lässt sich auch lösen.
      Und für die Zukunft merk dir, Artikel von "duerov" einfach ignorieren, das spart dir Zeit und uns beiden Nerven. Ach ja, und weil du ja hier die Allmacht besitzt kannst du die dir unwürdige Postings am besten gleich löschen, das ist die einfachste Problemlösung.

      Kommentar


      • #4
        Ach du schon wieder - hatte nicht auf den Nick geachtet.

        Hab mir dein Problem mal richtig durchgelesen, mein Posting war selbst
        lumpig, hast du Recht, aber bei gewissen Posting-Formaten (5 Tabellen
        hingeklatscht, schwammige Beschreibungen, ..) schalt ich ab.

        Egal, verstehe dein Problem immernoch nicht, denn worin liegt der
        Unterschied zwischen dem Code mit dem du alles ausliest, und dem mit
        den zusätzlichen WHERE-Bedingungen?
        Ist es denn nur möglich aus der Tabelle tb_hardwarebestand zu wählen?
        Dann hast du nämlich deine INNER JOINs sinnloserweise einfach
        weggelassen (warum?) und noch zusätzlich Fehler in die Bedingungslogik
        eingebaut:

        PHP-Code:
        <?
        if($_POST["hop"] != ""){
          $query_server_sql.= "hop_ID LIKE '" . $_POST["hop"] . "%' ";
        }
        if($_POST["Modell"] != ""){
          $query_server_sql.= "Modell LIKE '" . $_POST["Modell"] . "%' ";
        }
        if($Seriennummer != ""){
          $query_server_sql.= "AND Seriennummer LIKE '" . $Seriennummer . "%' ";

        ?>
        Wo ist der Verknüpfungsoperator bzw. wie erkennst du ob er benötigt
        wird? Ich würde die Bedingungen in einen Array schreiben und später per
        implode(' AND ', $sql) wieder zusammensetzen ^^

        Wenn die Suche auch in den anderen Tabellen stattfinden soll, einfach
        dort suchen, die IDs selektieren und gesammelt mit deiner
        Power-5-INNER-JOINs-Abfrage abfragen, eben mit entsprechender
        Abfrage nach den IDs.

        Kommentar


        • #5
          Hm, dann versuch ichs nochmal weniger schwammig auszudrücken.
          1. Hab eine Tabelle für die Hardwareoberpunkte --> tb_hop
          2. Eine Tabelle für die Hardwareunterpunkte --> tb_hup
          3. Und eine Tabelle in der alle Datensätze eingetragen werden
          (Die ID`s der Hardwareober/-und unterpunkte + ein paar andere Sachen) --> tb_hardwarebestand

          Die INNER JOINS die ich oben gepostet hab sind nur für die Verknüpfung zwischen den in
          tb_hardwarebestand eingetragenen ID`s und den zugehörigen "Werten" in den Tabellen tb_hop und tb_hup.
          Die if-Abfragen klären, ob der User ein Suchkriterium eingegeben hat if($_POST["hop"] != "").
          Wenn ja wird an das SELECT nacheinander eine Abfrage nach der Anderen gehängt.
          Im Prinzip hätte ich mir das ungefähr so gedacht:
          PHP-Code:
          $query_suchauswahl_sql mysql_query ("
                  SELECT e.ID, e.Name, e.Vorname, d.ID, d.Bemerkung, c.hup_Name, c.ID, b.hop_Name, b.ID, a.hop_ID, a.hup_ID, a.Seriennummer, a.Hersteller, a.Modell,
                  a.Merkmale, a.StandortID, a.NutzerimotionID
                  FROM tb_hardwarebestand AS a 
                  INNER JOIN tb_hop AS b ON a.hop_ID = b.ID
                  INNER JOIN tb_hup AS c ON a.hup_ID = c.ID
                  INNER JOIN standorte AS d ON a.StandortID = d.ID
                  INNER JOIN nutzerimotion AS e ON a.NutzerimotionID = e.ID"
          );
                                                                                 
          // Je nachdem ob die if-Abfrage true/false ist werden weitere Abfragen ans SELECT gehängt
                  
          if($_POST["hop"] != ""){
                      
          $query_suchauswahl_sql.= " WHERE a.hop_ID = '" $_POST["hop"] . "'";     // Wenn hop_ID in tb == der durch Auswahl des Users übertragenen ID wird dieses WHERE ans SELECT angehängt
                  
          }
                  if(
          $_POST["hup"] != ""){
                      
          $query_suchauswahl_sql.= " AND a.hup_ID = '" $_POST["hup"] . "' ";
                  }
                  if(
          $_POST["Seriennummer"] != ""){
                      
          $query_suchauswahl_sql.= " AND a.Seriennummer LIKE '" $_POST["Seriennummer"] . "' ";
                  }
          [...]
                  
          $query_suchauswahl mysql_query($query_suchauswahl_sql);

          while (
          $dsatz mysql_fetch_array($query_suchauswahl))
          {
              echo 
          "<TR><TD class='content-table'>" $dsatz["b.hop_Name"] . "</TD></TR>";
              echo 
          "<TR><TD class='content-table'>" $dsatz["c.hup_Name"] . "</TD>";
              echo 
          "<TD class='content-table'>" $dsatz["a.Seriennummer"] . "</TD>";
              [...]
              

          Wo ist der Verknüpfungsoperator bzw. wie erkennst du ob er benötigt
          wird? Ich würde die Bedingungen in einen Array schreiben und später per
          implode(' AND ', $sql) wieder zusammensetzen ^^
          Wenn die Suche auch in den anderen Tabellen stattfinden soll, einfach
          dort suchen, die IDs selektieren und gesammelt mit deiner
          Power-5-INNER-JOINs-Abfrage abfragen, eben mit entsprechender
          Abfrage nach den IDs.
          Und jetzt schau ich mal, ob ich deinen Vorschlag richtig verstanden hab und umsetzten kann.
          Danke einstweilen.

          Kommentar

          Lädt...
          X