Archiv verlassen und diese Seite im Standarddesign anzeigen : [MySQL] Probleme mit JOIN
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.
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
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...
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
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 ;)
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
was soll das erst werden, wenns schwierig wird ? :D :D
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.