backspace
Goto Top

Tabellen (MySQL) verknüpfen

Hallo zusammen,

habe erfolglos versucht zwei Tabellen (MySQL) über php zu verknüpfen:

"INSERT INTO Tabelle1 SELECT * FROM Tabelle2 where Tabelle2.BB NOT IN (SELECT Tabelle1.BB FROM Tabelle1);


beide Tabellen aus gleicher Datenbank:

Tabelle1:
id
AA
BB
C
D

Tabelle2:
AA
BB
E


Vorgaben:

-über "AA" und "BB" beide Tabellen verknüpfen.
-BB wird automatisch von Tabelle2 erzeugt (ID) und soll an Tabelle1 übergeben werden.


Danke im Voraus !

Gruß

Backspace

Content-Key: 155803

Url: https://administrator.de/contentid/155803

Printed on: April 23, 2024 at 17:04 o'clock

Member: dog
dog Nov 25, 2010 at 19:38:46 (UTC)
Goto Top
"INSERT INTO Tabelle1 SELECT * FROM Tabelle2 where Tabelle2.BB NOT IN (SELECT Tabelle1.BB FROM Tabelle1);

Wie soll bei dem Query MySQL erkennen was wozu gehört, wenn nichtmal ein Mensch das kann?

Und diese Informationsarmut hilft auch nicht sonderlich...
Member: Backspace
Backspace Nov 25, 2010 at 20:15:49 (UTC)
Goto Top
Ich hoffe, so ist es klarer ersichtlich:

Tabelle1:
id
macadresse
id_mac
drive
datum

Tabelle2:
macadresse
id_mac


Mein Versuch dazu:
INSERT INTO Tabelle1 SELECT * FROM Tabelle2 where Tabelle2.id_mac NOT IN (SELECT Tabelle1.id_mac FROM Tabelle1)


Es geht darum, beide Tabellen über „macadresse“ und „id_mac“ zu verknüpfen.

„id_mac“ wird in Tabelle2 erzeugt.


Backspace
Member: dog
dog Nov 25, 2010 at 20:19:28 (UTC)
Goto Top
Was meinst du mit "verknüpfen"???
Deutlicher bitte.
Member: Backspace
Backspace Nov 25, 2010 at 20:48:49 (UTC)
Goto Top
Tabelle2 enthält alle bekannten Macadressen und die entsprechend zugeordneten id_mac.
1.Macadresse >> hat eine id_mac=1
2.Macadresse >> hat eine id_mac=2, usw.


Tabelle1 enthält ausgelesene Werte von verschiedenen Rechnern.

Die id_mac sollen eine Auswertung der gesammelten Werte aus Tabelle1 erleichtern, so braucht man für jeden Host nur noch die id_mac einzugeben, und nicht mehr die komplizierte Macadresse, will man die entsprechenden Werte eines bestimmten Hosts haben.

Das Ziel ist, dass nur noch die id_mac-Werte aus Tabelle2 auch in die id_mac-Spalte in Tabelle1 eingetragen werden, passend zu den Macadressen !!

Die Macadressen und die anderen Werte werden bereits per PHP in beide Tabellen eingetragen.

Danke

Backspace
Member: nxclass
nxclass Nov 25, 2010 at 22:49:16 (UTC)
Goto Top
REPLACE INTO tabelle1 ( macadresse, id_mac ) SELECT macadresse, id_mac FROM tabelle2;
... damit das funktioniert muss über die Spalte macadresse ein UNIQUE (oder PRIMARY KEY) Schlüssel in tabelle1 gesetzt sein. Evtl. vorhandene id_mac Werte werden dann natürlich überschrieben.
Member: filippg
filippg Nov 26, 2010 at 01:45:58 (UTC)
Goto Top
Hallo,

ich würde ein
SELECT * FROM Tabelle1 as t1 JOIN Tabelle2 as t2 ON t1.macadresse = t2.macadresee WHERE t2.id_mac = <gesuchterWert>
versuchen (wobei ich mir nicht sicher bin, ob MySQL das "as t..." mag, ich komme vom MS SQL).

Okay... nochmal die "Aufgabe" gelesen.
Was willst du eigentlich? Wann soll die "verknüpfung" erzeugt werden (dein Beispiel enthält ein INSERT, dann schreibst du aber was von Auswertung (was auf Query-Time, also Select deutet))? Und welchen Sinn macht Tabelle2 überhaupt, wenn alle ihre Informationen schon in Tabelle1 enthalten sind? Kann es sein, dass einfach dein Datenbank-Design Unsinn ist?

Gruß

Filipp
Member: Backspace
Backspace Nov 26, 2010 at 06:11:24 (UTC)
Goto Top
Hallo,

@filipp:

Es geht erstmal nur darum, dass die id_mac aus Tabelle2 auch in Tabelle1 eingetragen werden (Verknüpfung) !

Das mit der Auswertung war nur eine Erklärung warum es die id_mac (Tabelle2) überhaupt gibt.

Zitat von mir:
"Das Ziel ist, dass nur noch die id_mac-Werte aus Tabelle2 auch in die id_mac-Spalte in Tabelle1 eingetragen werden, passend zu den Macadressen !!"


Die zweite Tabelle ist kein Unsinn, sondern hat sehr wohl ihre Berechtigung.

In ihr werden wie ich bereits erwähnt habe, alle bekannten Macadressen (von allen Hosts) aufgelistet, jede Macadresse bekommt in der zweiten Tabelle ihre eigene id_mac zugewiesen, diese wiederrum werden mit Tabelle1 verknüpft, um ein späteres manuelles Abfragen der unendlich vielen Werte aus Tabelle1 zu erleichtern.

Es ist viel einfacher nur nach einer id_mac=1 zu suchen, als eben eine solche Eingabe tätigen zu müssen: 00:0F:57:41:13:1E:CD

Es wäre sicherlich auch möglich, ohne eine zweite Tabelle auszukommen, indem ich z.B. die Tabelle1 mit einer weiteren Spalte "Hostname" erweitert hätte, jedoch kam das leider nicht in Frage, da sich Hostnamen im Laufe der Zeit eben ändern können. Das wiederrum gilt nicht für die primäre Macadresse, deswegen die Notwendigkeit einer zweiten Tabelle.


Backspace
Member: nxclass
nxclass Nov 26, 2010 at 07:39:14 (UTC)
Goto Top
Es ist viel einfacher nur nach einer id_mac=1 zu suchen, als eben eine solche Eingabe tätigen zu müssen: 00:0F:57:41:13:1E:CD
... ich nehme mal an, daß die \'id_mac\' dann irgendwo auf der Netzwerkkarte oder dem PC aufgeklebt ist.

Ist die Tabelle \'tabelle2\' nur für den Import der Daten in Tabelle \'tabelle1\' gedacht ? (dann würde das Sinn machen) - wenn nicht kann doch bei der Abfrage ein JOIN vollkommen ausreichen. Man muss dann nur über die Spalte \'id_mac\' in beiden Tabellen ein Index erzeugen.

weiteren Spalte \"Hostname\" erweitert hätte, jedoch kam das leider nicht in Frage, da sich Hostnamen im Laufe der Zeit eben ändern können.
Ich würde dann andere Tabellen anlegen:
rechner :: id, standort, (id_pc) ...
adapter :: id, rechner_id, macadresse, (id_mac), ...
hosts :: id, rechner_id, gueltig_seit, name, ...
so kann man zu jedem Rechner/Gerät - Adapter zuordnen und auch mehrere Hosts abspeichern.
Die id_pc und id_mac kann man dann als \'vom Menschen benutzbare\' Zeichenkette nutzen.
Member: MadMax
MadMax Nov 26, 2010 at 08:54:34 (UTC)
Goto Top
Hallo Backspace,

den ganzen Wust da oben hab ich mir jetzt nicht durchgelesen, aber mal abgesehen davon, daß die Spalten der einen Tabelle nicht mit denen der anderen übereinstimmen, sieht der Befehl eigentlich ganz ok aus. Wenn Du die Spalten mit angibst sollte es also funktionieren:
INSERT INTO Tabelle1 (macadresse, id_mac) SELECT macadresse, id_mac FROM Tabelle2 where Tabelle2.id_mac NOT IN (SELECT Tabelle1.id_mac FROM Tabelle1)
Allerdings kann es sein, daß Du noch andere Spalten in Tabelle1 füllen mußt, wenn eine der Spalten eben kein NULL zuläßt und keinen Standardwert hat. Außerdem gehe ich davon aus, daß die Datentypen der beiden Spalten in den beiden Tabellen übereinstimmen.

Hilfreich wäre bei solchen Fragen übrigens, wenn Du kurz schreiben könntest, was an Deinem Versuch erfolglos war:
- gab es einen Fehler?
- gab es keinen Fehler, aber keine Daten wurden eingelesen?
- ist der Rechner explodiert?
- ...

Gruß, Mad Max
Member: Backspace
Backspace Nov 26, 2010 at 10:27:33 (UTC)
Goto Top
Hallo Mad Max,

das Problem lag darin,dass eine Ellenlange Fehlermeldung mit "Zeitzone,..........." kam.

Mit Deiner Modifizierung, kommt keine Fehlermeldung mehr, jedoch wird bei id_mac in Tabelle1 leider auch kein Eintrag getätigt, bleibt also ohne Funktion.


@nxclass:

das id_mac steht auf keinem Rechner etc., es ist die von der Tabelle automatisch zugewiesene id.


Gruß

Backspace
Member: MadMax
MadMax Nov 26, 2010 at 11:33:06 (UTC)
Goto Top
Dann nehme ich mal an, daß da keine neuen Datensätze in Tabelle2 stehen. Um bestehende Daten zu aktualisieren heißt der Befehl bei MySQL meine ich:
UPDATE Tabelle1, Tabelle2 SET Tabelle1.macadresse = Tabelle2.macadresse WHERE Tabelle1.id_mac = Tabelle2.id_mac

Gruß, Mad Max
Member: Backspace
Backspace Nov 26, 2010 at 12:17:05 (UTC)
Goto Top
Die Datensätze für die Tabellen werden sowohl von einer Shelldatei als auch einer Batchdatei ausgelesen und über PHP in die Tabellen eingetragen.

Ich habe die Shelldatei/Batchdatei immer manuell ausgeführt, um neue Datensätze zu erhalten, d.h. die Tabellen hatten immer neue Datensätze, hab beide Tabellen auch immer wieder komplett entleert und wieder neu befüllen lassen.

Gruß

Backspace


Nachtrag:

Hab´s jetzt damit versucht:

$sql_tabelle1 = "REPLACE INTO tabelle1 (id_mac) SELECT id_mac FROM tabelle2;";


Ergebnis: die id_mac-Werte werden zwar eingetragen, jedoch in eigene Zeilen, also nicht zusammen mit den anderen Werten in eine gemeinsame Zeile.
Member: nxclass
nxclass Nov 26, 2010 at 18:54:51 (UTC)
Goto Top
REPLACE INTO tabelle1 (id_mac) SELECT id_mac FROM tabelle2
jedoch in eigene Zeilen, also nicht zusammen mit den anderen Werten
woher soll 'er' auch wissen wohin er die Eintrage sichern soll - die eindeutige Zuordnung mit der macadresse fehlt.