Querry für mehrere Tabellen

TonyS

Neuer Benutzer
Beiträge
2
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
 
Werbung:
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...
 
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
        
                                    )
 
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
 
Werbung:
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:

db_uebersicht.PNG


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
 
Zurück
Oben