Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Querry für mehrere Tabellen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von TonyS, 18 Juni 2012.

  1. TonyS

    TonyS Neuer Benutzer

    Hallo Forum,

    ich bin neu in Sachen SQL und habe trotzdem ein etwas größeres Projekt angefangen.
    Es geht nämlich um die Beschriftung von Kabeln in Servern und den Rückschluss darauf zu welcher Leitung ein Kabel gehört. Dazu gehört Ebenso das Gerät, der Port und der Ort. Das steht auch schon die Tabellen hierfür habe ich soweit von der Struktur her fertig.

    Hier einmal alle Tabellen und das Schema für den allgemeinen Aufbau.
    https://docs.google.com/spreadsheet/ccc?key=0AqzIpML5mhf6dFZhMUthQS1Mcm05RzFuQ1F2dXUyTEE

    Der einzige Parameter der übergeben werden soll, ist die ID der Etikette.
    Es ist nämlich so gedacht das ich das Ende eines Kabels scanne und dann direkt sehe wo die Leitung lang führt bzw. alle anderen Etiketten die zu dieser Leitung gehören. Vereinfacht kann man sagen, es gibt ein Teilstück, an dem sind zwei Etiketten, die jeweils immer an einem Gerät hängen.

    Mein Problem besteht also "nur" in der SQL-Abfrage,
    ich möchte folgendes ausgegeben haben wenn ich bspw. Etikette 1 Scanne:

    [datenschrank_bezeichnung] = DS1
    [geraet_bezeichnung] = Gerät 1
    [portnummer] = Port A
    (das wäre Etikette 1)

    [datenschrank_bezeichnung] = DS1
    [geraet_bezeichnung] = Gerät 2
    [portnummer] = Port B
    usw usw ...
    ohne die eckigen Klammern, das sind ja die Spaltennamen - aber die Ausgabe bekomm ich dann mit HTML schon selber hin ^^


    Die SQL-Abfrage die ich hier probiert habe ist folgende:
    Code:
    SELECT
      leitung.leitung_id,
      teilstueck.teilstueck_id,
      datenschrank.datenschrank_bezeichnung,
      geraet.geraet_bezeichnung,
      portnummer,
      etikett_id
    FROM
      etikett
      LEFT JOIN teilstueck ON etikett.teilstueck_id = teilstueck.teilstueck_id
       LEFT JOIN leitung ON teilstueck.leitung_id = leitung.leitung_id
       LEFT JOIN datenschrank ON etikett.datenschrank_id = datenschrank.datenschrank_id
       LEFT JOIN geraet ON etikett.geraet_id = geraet.geraet_id
    WHERE
      etikett_id = 1
    
    Dabei bekomm ich aber eben auch nur die Etikette 1 ...

    Wäre toll wenn ir jemand sagen kann wie es richtig wäre um auf mein gewünschtes Ergebnis zu kommen und mir erklärt warum und wieso. Ich will eben auch noch was dabei lernen^^

    MfG Tony
     
  2. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    Hy,

    naja hier scannst du die Etiketten_ID, daher bekommst du auch nur Etikette 1!!! (wegen der "WHERE" - Klause)

    Wenn ich das richtig verstehe, würdest du irgendeinen Strichcode an der "Leitung" scannen und dies müsste die "Leitungs_ID" ODER eine Leitungsnummer (welche eindeutig ist) sein.

    Dann könntest du zu der Leitung die Etiketten ermitteln!


    Hier müsstest du ein Select-Stmt absetzen um die Leitungs_ID anhand der Etiketten_ID zu erhalten. (wie schon von dir geschrieben)
    Anschließend ein Stmt, welches dir anhand der "Leitungs_ID" die Etiketten liefert.

    Ich versuchs mal und meld mich noch...
     
  3. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    So, das müsste es sein...

    Code:
    
    Select datenschrank.datenschrank_bezeichnung as Datenschrank
          ,geraet.geraet_bezeichnung as Geraet
          ,etikett.portnummer as Port
    
        etikett
        LEFT JOIN teilstueck ON etikett.teilstueck_id = teilstueck.teilstueck_id
        LEFT JOIN leitung ON teilstueck.leitung_id = leitung.leitung_id
        LEFT JOIN datenschrank ON etikett.datenschrank_id = datenschrank.datenschrank_id
        LEFT JOIN geraet ON etikett.geraet_id = geraet.geraet_id
         
        where teilstueck.leitung_id IN (
    
                    Select t.leitung_id
        
                        From etikett e
                            ,teilstueck t
                
                            where e.teilstueck_id = t.teilstueck_id
                            AND e.etikett_id = 1 --eingelesener Wert
            
                                        )
     
    
     
  4. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    So... zur Erklärung (hätte ich fast vergessen) :(

    Das Subselect (welches in der Klammer nach "IN" steht) liefert alles Leitungs_IDs (normalerweise nur EINE) je Etikette.
    Somit liefert das äußere SQL-Stmt zu ALLEN Leitungs_IDs des Subselects die Etiketten!!!

    Sofern ich deinen Tabellenaufbau richtig verstanden habe..... ;)

    Lg
     
  5. TonyS

    TonyS Neuer Benutzer

    Danke schon mal für die Mühe. Ich glaub ich muss da noch was ergänzen, als Übergabeparameter gibt es definitiv nur Edtiketten ID.
    Dieses zu scannende Kabelende zeigt dann auf ein PHP-Dokument dem ich eben nur die Etikette übergebe.
    Ich hatte jetzt noch einen Fehlereinem Query:

    "#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'etikett LEFT JOIN teilstueck ON etikett . teilstueck_id = teilstueck . teilstue' at line 1 " rein von der syntax her ist ja nichts flasch?

    Vom Ablauf habe ich mir das ja so gedacht:
    1. finde die Etikette die dem übergeben Wert entspricht
    2. Schau in der gefundenen Etikette nach zu welcher Leitung diese gehört
    3. Zeige alle anderen Etiketten an, die zu dieser Leitung gehören.

    Was ich vllt vergessen habe zu erwähnen und was wichtig für die Ausgabe per PHP/HTML ist;
    Ein Kabel sieht ja grundsätzlich so aus [Etikette][Kabel][Etikette], das Kabel heißt bei mir Teilstück.
    Wenn ich ein Kabel gescannt habe springt wie gesagt die Website auf und es soll das gescannte Kabel markiert werden und das Gegenstück - zusätzlich zu den anderen Etiketten die halt mit zur Leitung gehören.
    Ähnlich wie es hier ist nur das Spalten und Darstellung nicht ganz dem beschriebenen entsprechen:

    [​IMG]

    Als der Code in etwa so aber das ist auch das geringere Übel:

    Code:
    while ($Resultset = mysql_fetch_object($GetSql)){
          if ($Resultset->etikett_id == $EtikettId){
            echo '
              <tr>' .
              '<td>Gescannt</td>' .
              '<td>' . $Resultset->teilstueck_bezeichnung . '</td>' .
              '<td>' . $Resultset->portnummer . '</td>' .
            '</tr>'
            ;
          }
          else if ($Resultset->teilstueck_id == $TeilstueckId){
            echo '
              <tr>' .
              '<td>Zugehörig</td>' .
              '<td>' . $Resultset->teilstueck_bezeichnung . '</td>' .
              '<td>' . $Resultset->portnummer . '</td>' .
            '</tr>'
            ;
          }
    Tschuldiung für die Mühe aber Danke noch mal vllt schaffen wir/du es ja :D.
    Vielleicht hilft es dir ja, wenn ich dir mal den Dump gebe: http://pastebin.com/Kts3yb77
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden