2016-09-23 4 views
0

Ich versuche, eine Tabelle mit Joins zu 3 verschiedenen Tabellen zu filtern, wo eine Verbindung eine Platzhalterkarte als Teil der Join-Kriterien enthält. Dies führt dazu, dass das Ergebnis zusätzliche/unerwünschte Zeilen ausgibt. Ich kann nicht herausfinden, wie ich diese los werde.Filter MYSQL Ergebnisse auf Platzhalter JOINS

Die Ausrüstung besteht aus Chassis mit 1 oder 2 Supervisor-Karten. Jede Supervisor-Karte hat ihre eigene IP-Adresse. Wenn das die einzige Chassis hat eine Supervisor-Karte installiert es als Bezug genommen wird: 01-xxxx: N: xxxx < N in dieser Position

Wenn es zwei Supervisor-Karten hat, ist es referenziert als:

01 -xxxx: P: xxxx < -P für primäre

01-xxxx: S: xxxx < ES für Sekundär

Die Verbindungstabelle besteht aus Quelle und Ziel-Chassis. Dies beschreibt nur die Verbindungen zwischen den Gehäusen. Jedes Chassis wird nur mit 01-xxxx: N: xxxx oder dem primären Switch-Controller 01-xxxx: P: xxxx beschrieben. Es gibt zwei "Pfade" für EAST (E) und WEST (W) für jede Quelle und jedes Ziel.

Ich versuche, die IP-Adressen des 01-xxxx zu erhalten: P: xxxx und 01-xxxx: S: xxxx aus dem 'Ausrüstung' Tisch, an dem die 'Verbindungen' Tabelle nur Verweise primäre Geräte 01-xxxx: P: xxxx und dann eine VLAN-ID aus einer dritten Tabelle basierend darauf, ob die IP-Adresse aus der 'Equipment'-Tabelle innerhalb eines IP-Bereichs ist und jede Zeile korrekt anzeigt mit: East Quelle und Ziel + East IP und EAST VLAN (basierend auf IP innerhalb eines Bereichs)
und WEST Quelle und Ziel + WEST IP und WEST VLAN (basierend auf IP innerhalb eines Bereichs) (wenn es)
eine Probe Ausrüstung Tabelle vorhanden ist:

`equipment` (`id`, `site_code`, `site_id`, `system_name`, `ip_add`, `mcast`, `sys_loc`, `systype`, `itamname`, `dimetis`, `DNS`) VALUES 
(686, '25A2', 'TAS:BAUS:MTWEL', '01-25A2:P:TAS:BAUS:MT_WELINGTON', 172525962, 4013364224, 'ACLE RD, PRK', 6, '01-25a2-p-tas-baus-mt-welington', 0, 1), 
(687, '25A2', 'TAS:BAUS:MTWEL', '01-25A2:S:TAS:BAUS:MT_WELINGTON', 172526090, 4013364224, 'ACLE RD, PRK', 6, '01-25a2-s-tas-baus-mt-welington', 0, 1); 

Die conenctions Tabelle:

`connections` (`id`, `system_name_source`, `port_type`, `slot_source`, `port_source`, `system_name_dest`, `slot_dest`, `port_dest`, `cable`, `side_name`, `side`, `status`) VALUES 
(332, '01-54A1:P:TAS:TLS:BATHURST', '1G Tunk', '10', '01', '01-25A2:P:TAS:BAUS:MT_WELINGTON', '12', '01', 'D 25A2 54A1 DD001', '01-54A2:P:TAS:TLS:DAVEY', 'W', 1), 
(343, '01-54A2:P:TAS:TLS:DAVEY', '1G Tunk', '10', '01', '01-25A2:P:TAS:BAUS:MT_WELINGTON', '11', '01', 'D 25A2 54A2 DD001', '01-54A1:P:TAS:TLS:BATHURST', 'E', 1); 

VLAN/IP-Bereich Tabelle:

`vlan_agg` (`id`, `vl_system_name`, `vlan_id`, `ip_sub`, `bcast`, `cidr`) VALUES 
(40, '01-54A2:P:TAS:TLS:DAVEY', 72, 172525952, 172526079, 25), 
(41, '01-54A1:P:TAS:TLS:BATHURST', 73, 172526080, 172526207, 25); 

Meine Frage:

SELECT 

connections.system_name_dest, 
connections.side, 
tgt.system_name AS system_name, 
tgt.ip_add AS dest_ip, 
dvlan.vlan_id AS d_vlan_id 

FROM connections 
LEFT JOIN equipment tgt on SUBSTRING(tgt.system_name,1,8) like SUBSTRING(connections.system_name_dest,1,8) 
LEFT JOIN vlan_agg dvlan on tgt.ip_add BETWEEN dvlan.ip_sub AND dvlan.bcast 

where system_name_dest='01-25A2:P:TAS:BAUS:MT_WELINGTON' 
Order By side 

Dies erzeugt vier Reihen mit 2 falschen Ziel-IP-Adressen mit und VLANS:

Array ([system_name_dest] => 01-25A2:P:TAS:BAUS:MT_WELINGTON [side] => E [system_name] => 01-25A2:S:TAS:BAUS:MT_WELINGTON [dest_ip] => 172526090 [d_vlan_id] => 73) 
Array ([system_name_dest] => 01-25A2:P:TAS:BAUS:MT_WELINGTON [side] => E [system_name] => 01-25A2:P:TAS:BAUS:MT_WELINGTON [dest_ip] => 172525962 [d_vlan_id] => 72) 
Array ([system_name_dest] => 01-25A2:P:TAS:BAUS:MT_WELINGTON [side] => W [system_name] => 01-25A2:P:TAS:BAUS:MT_WELINGTON [dest_ip] => 172525962 [d_vlan_id] => 72) 
Array ([system_name_dest] => 01-25A2:P:TAS:BAUS:MT_WELINGTON [side] => W [system_name] => 01-25A2:S:TAS:BAUS:MT_WELINGTON [dest_ip] => 172526090 [d_vlan_id] => 73) 

Die richtige Ausgabe sollte Adresse East IP wird mit und Ost-VLAN basierend auf Hauptkarte und West-IP und West-Vlan basierend auf Secondary-Karte in Geräten Tabelle:

Array ([system_name_dest] => 01-25A2:P:TAS:BAUS:MT_WELINGTON [side] => E [system_name] => 01-25A2:S:TAS:BAUS:MT_WELINGTON [dest_ip] => 172526090 [d_vlan_id] => 73) 
Array ([system_name_dest] => 01-25A2:P:TAS:BAUS:MT_WELINGTON [side] => W [system_name] => 01-25A2:S:TAS:BAUS:MT_WELINGTON [dest_ip] => 172526090 [d_vlan_id] => 73) 

Jede Hilfe würden geschätzt. Ich kämpfe seit Tagen damit.

+0

ich nicht ganz sicher bin, was Sie zu bekommen versuchen. Aber Ihre LEFT Ausrüstung tgt auf SUBSTRING JOIN (tgt.system_name, 1,8) wie SUBSTRING (connections.system_name_dest, 1,8) 'wird natürlich geben Ihnen 4 Zeilen (und sie bekommen weniger nicht mehr), da beide Ihre Verbindung hat den gleichen Wert für 'SUBSTRING (connections.system_name_dest, 1,8)', und beide Ihrer Geräte haben den gleichen Wert für 'SUBSTRING (tgt.system_name, 1,8)' (alle sind '01-25A2: '). Dies gibt Ihnen 2 mal 2 = 4 Zeilen. Wie gesagt, ich weiß nicht genau, was Sie versuchen, beizutreten, aber Sie haben wahrscheinlich eine Bedingung dort verpasst (oder 8-> 9?) – Solarflare

+0

Hallo Solarflare, Danke für Ihre Antwort. Ich verstehe, dass alle 01-25A2 sind: und warum ich 4 Reihen bekomme. Ich kann nicht herausfinden, wie ich die 2 Zeilen bekomme, die ich möchte. Das Problem ist, dass die "Verbindungs" -Tabelle NUR 01-25A2: ** P ** hat, aber die "Ausrüstung" -Tabelle, der ich mich anschließe, hat 01-25A2: ** P ** und 01-25A2: ** S **. Die Gerätetabelle enthält die Daten, die benötigt werden, um sich der VLAN-Tabelle anzuschließen, um VLAN-IDs zu erhalten. ich für ein Verfahren suchen die IP und VLAN für Ost- und Westseite sowie die anderen Zeilendaten zu erhalten. – Nigel

+0

Ich verstehe Ihr Datamodel oder Ihre Erklärungen leider immer noch nicht, also versuchen wir es anders: a) Ohne die Joins zu 'vlan_agg' würde Ihr Datamodel 4 oder 2 Ergebnisse von 'join' zu' tgt' und geben 'src'? Oder können Sie z. schon 'side' verwenden, um die richtigen Zeilen zu erhalten? Sie können dann den On-Zustand beheben. b) Können Sie mir aus Ihrer 4-Zeilen-Ergebnismenge nur anhand der Werte in der Zeile sagen, welche Zeilen nicht korrekt sind (auch wenn Sie sie nicht anzeigen, solange sie in der Tabelle stehen und in der Zeile mit sind) 'select *'), nicht mit Blick auf die anderen 3 Reihen? Sie können dann ein 'wo' verwenden. – Solarflare

Antwort

0

Das zusätzliche Feld, das ich hinzugefügt habe, hat genug Informationen gegeben, um einen Filter zu entwickeln, der funktioniert. (Danke @solarflare - seine Fragen eine Lösung ausgelöst)

Abfrage sieht nun wie:

SELECT 

connections.system_name_dest, 
connections.side, 
tgt.system_name AS system_name, 
tgt.ip_add AS dest_ip, 
dvlan.vlan_id AS d_vlan_id 

FROM connections 
LEFT JOIN equipment tgt on SUBSTRING(tgt.system_name,1,8) like SUBSTRING(connections.system_name_dest,1,8) 
LEFT JOIN vlan_agg dvlan on tgt.ip_add BETWEEN dvlan.ip_sub AND dvlan.bcast 

where system_name_dest='01-25A2:P:TAS:BAUS:MT_WELINGTON' and ((system_name NOT LIKE '%:S:%' and side = 'E') OR (system_name LIKE '%:S:%' and side = 'W')) 
Order By side