PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [MySQL] Probleme mit JOIN



ClausVB
24-03-2006, 06:56
Hallo!

Ziel ist es nicht die ID des Quell- und Zielservers auszugeben, sondern die IP-Adressen.

Folgende Abfrage bekomme ich hin:


mysql> SELECT einzelauftraege.id, einzelauftraege.name, zielserver_id, ftp_server.adresse, quellserver_id, ftp_server.adresse, einzelauftraege.datum_zeit
FROM einzelauftraege
LEFT JOIN ftp_server ON zielserver_id = ftp_server.id;
+----+-------------------+---------------+-----------------+----------------+-----------------+---------------------+
| id | name | zielserver_id | adresse | quellserver_id | adresse | datum_zeit |
+----+-------------------+---------------+-----------------+----------------+-----------------+---------------------+
| 1 | CVB_test00 | 9 | 10.101.0.7 | 10 | 10.101.0.7 | 2006-03-21 10:00:00 |
| 2 | Name des Auftrags | 1 | 10.101.193.129 | 5 | 10.101.193.129 | 2006-03-23 08:02:59 |
+----+-------------------+---------------+-----------------+----------------+-----------------+---------------------+
2 rows in set (0.00 sec)

Die Tabelle "ftp_server sieht so aus.


mysql> SELECT id, adresse, quelle_ziel FROM ftp_server;
+----+-----------------+-------------+
| id | adresse | quelle_ziel |
+----+-----------------+-------------+
| 1 | 10.101.193.129 | z |
| 5 | 10.101.160.57 | q |
| 8 | 10.101.163.79 | q |
| 9 | 10.101.0.7 | z |
| 10 | 10.101.193.129 | q |
+----+-----------------+-------------+
5 rows in set (0.00 sec)

Kann natürlich sein, dass es mit den Strukturen und JOIN nicht geht. Ich habe schon mal daran gedacht IF-Strukturen (geht mit MySQL ja) in der WHERE Bedinung zu verwenden, aber vielleicht geht es ja auch über JOIN?

Gruß und Danke,
Claus

yankee42
24-03-2006, 10:16
Du hast doch da ein scheinbar funktionierendes JOIN. Wo ist denn das Problem? WIe soll das Ergebinis denn aussehen?

Romanday
24-03-2006, 12:12
Hallo!
Kann natürlich sein, dass es mit den Strukturen und JOIN nicht geht. Ich habe schon mal daran gedacht IF-Strukturen (geht mit MySQL ja) in der WHERE Bedinung zu verwenden, aber vielleicht geht es ja auch über JOIN?

Gruß und Danke,
Claus

SELECT einzelauftraege.id, einzelauftraege.name, zielserver_id, ftp_server.adresse, quellserver_id, ftp_server.adresse, einzelauftraege.datum_zeit
FROM einzelauftraege
LEFT JOIN ftp_server ON zielserver_id = ftp_server.id;

Du solltest überall die Punkt Syntax verwenden, + die Tabellen die
du abfragst müssen natürlich in der FROM Klausel auch vorkommen.

Danach...
Wenn Du Zeit hast, verschiedene mal Join Varianten ausprobieren
und die Geschwingkeit optimieren.

ClausVB
27-03-2006, 09:30
Du hast doch da ein scheinbar funktionierendes JOIN. Wo ist denn das Problem? WIe soll das Ergebinis denn aussehen?
So soll das Ergebnis aussehen. Der JOIN liefert im Moment nur die Ziel-Adresse richtig zurück, jedoch nicht die Quelladresse.

+----+-------------------+-----------------+-----------------+---------------------+
| id | name | ziel_adresse | quell_adresse | datum_zeit |
+----+-------------------+-----------------+-----------------+---------------------+
| 1 | CVB_test00 | 10.101.0.7 | 10.101.193.129 | 2006-03-21 10:00:00 |
| 2 | Name des Auftrags | 129.101.193.129 | 10.101.163.79 | 2006-03-23 08:02:59 |
+----+-------------------+-----------------+-----------------+---------------------+
Man kann die ID's und die dazugehörigen Werte ja in den beiden Tabellen oben ablesen und sehen, dass mein JOIN ein falsches Ergebnis zurückliefert.

Wie baue ich den JOIN für beide Adressen richtig auf?

Gruß
Claus

elrond
27-03-2006, 10:15
du musst einfach die tabelle ftp_server zweimal mit den aufträgen joinen, etwa so


select a.*,fq.ip_address,fz.ip_axddress from auftrag a, ftp fq, ftp fz where a.quellid=fz.id and a.zielid=fz.id

ps: wird so nicht funktionieren, da ich mir auf die schnelle nicht die mühe gemacht habe, deine tab-name abzutippen. es geht ums prinzip...

ClausVB
27-03-2006, 12:56
ps: wird so nicht funktionieren, da ich mir auf die schnelle nicht die mühe gemacht habe, deine tab-name abzutippen. es geht ums prinzip...

Danke Elrond, aber funktioniert auch nicht. Ich habe das mal umgestrickt:

mysql> SELECT e.id, e.name, e.zielserver_id, f.adresse AS ziel_server, e.quellserver_id, e.datum_zeit
FROM einzelauftraege AS e, ftp_server AS f
WHERE e.quellserver_id = f.id AND e.zielserver_id = f.id;
Empty set (0.03 sec)

mit OR bringt es schon mehr aber auch nicht das gewünschte Ergebnis.


mysql> SELECT e.id, e.name, e.zielserver_id, f.adresse AS ziel_server, e.quellserver_id, e.datum_zeit
FROM einzelauftraege AS e, ftp_server AS f
WHERE e.quellserver_id = f.id OR e.zielserver_id = f.id;
+----+-------------------+---------------+-----------------+----------------+---------------------+
| id | name | zielserver_id | ziel_server | quellserver_id | datum_zeit |
+----+-------------------+---------------+-----------------+----------------+---------------------+
| 2 | Name des Auftrags | 1 | 10.101.193.129 | 5 | 2006-03-23 08:02:59 |
| 2 | Name des Auftrags | 1 | 10.101.160.57 | 5 | 2006-03-23 08:02:59 |
| 1 | CVB_test00 | 8 | 10.101.163.79 | 10 | 2006-03-21 10:00:00 |
| 1 | CVB_test00 | 8 | 10.101.193.129 | 10 | 2006-03-21 10:00:00 |
+----+-------------------+---------------+-----------------+----------------+---------------------+
4 rows in set (0.00 sec)
Wenigstens stehen die richtigen IP-Adressen jetzt untereinander ... es wäre aber schön, wenn sie in einer Zeile (siehe Beispiel oben) stehen würden.

Sonst noch Ideen? Vielleicht ein UNIION oder so?

Gruß
Claus

elrond
27-03-2006, 13:03
Du willst neben dem Auftrag die ip des Quellservers und die des Zielservers sehen, richtig?
Wenn ja, war mein vorhergehendes Post doch nicht ausreichend erleuchtend... :D

versuch das hier:

SELECT e.id, e.name, e.zielserver_id, z.adresse AS ziel_server,q.adresse AS quell_server, e.quellserver_id, e.datum_zeit
FROM einzelauftraege AS e, ftp_server AS q, ftp_server AS z
WHERE e.quellserver_id = q.id
and e.zielserver_id = z.id;

Die idee ist weiterhin die Tabell ftp_server _ZWEIMAL_ in der Abfrage zu benutzen ;)

ClausVB
27-03-2006, 13:21
Du willst neben dem Auftrag die ip des Quellservers und die des Zielservers sehen, richtig?
Wenn ja, war mein vorhergehendes Post doch nicht ausreichend erleuchtend...
Nein, der Fehler liegt auf meiner Seite, ich hätte mir die Abkürzungen vergegenwärtigen sollen.

So funktioniert es:

mysql> SELECT e.id, e.name, z.adresse AS ziel_server, q.adresse AS quell_server, e.datum_zeit
FROM einzelauftraege AS e, ftp_server AS q, ftp_server AS z
WHERE e.quellserver_id = q.id
AND e.zielserver_id = z.id;
+----+-------------------+-----------------+-----------------+---------------------+
| id | name | ziel_server | quell_server | datum_zeit |
+----+-------------------+-----------------+-----------------+---------------------+
| 1 | CVB_test00 | 129.101.163.79 | 129.101.193.129 | 2006-03-21 10:00:00 |
| 2 | Name des Auftrags | 129.101.193.129 | 129.101.160.57 | 2006-03-23 08:02:59 |
+----+-------------------+-----------------+-----------------+---------------------+
2 rows in set (0.14 sec)
Problem gelöst, ganz herzlichen Dank! *Claus sich vor Elrond verneigt.*

Gruß
Claus

elrond
27-03-2006, 13:23
was soll das erst werden, wenns schwierig wird ? :D :D

ClausVB
27-03-2006, 13:25
was soll das erst werden, wenns schwierig wird ? :D :D
Dann werde ich Dein Sklave :-) zuerst für ein Jahr und wenns noch schwieriger wird auf Lebenszeit :-).

Gruß und Danke,
Claus

Romanday
02-04-2006, 16:35
Dann werde ich Dein Sklave :-) zuerst für ein Jahr und wenns noch schwieriger wird auf Lebenszeit :-).

Gruß und Danke,
Claus

Das sind ja mal vorbildliche Angebote.:D