Unterschiede und neue Einträge in zwei MySQL Tabellen vergleichen und ausgeben

Rigoo

Grünschnabel
Hallo zusammen,

folgendes stelle ich mir vor und Frage mich, wie das ganze zu lösen ist - bzw. ob das überhaupt relativ einfach zu lösen ist?

Ausgangspunkt ist der, das ich zwischen zwei Versionen einer Software die Tabelleninhalte einer speziellen Spalte auf Unterschiede vergleichen muss, um für eine Übersetzung die Änderungen zu Dokumentieren und durchzuführen.

Die Gegenbenheiten (Beispiel):

Tabellen:

  • tabelle1 (alte Version der Software)
  • tabelle2 (neue Version der Software)

Spalten (nur einige, eben die wichtigen):

  • paket (es gibt verschiedene bereiche in der software, die in der übersetzung in "pakete" aufgeteilt sind)
  • schluessel (jeder eintrag hat einen eindeutigen schlüssel, z.b. "ueberschrift_hauptseite", der aber in UNTERSCHIEDLICHEN paketen auch öfter vorkommen kann, was für mich das hauptproblem beim erstellen eines logischen mysql queries darstellt)
  • text (spalte mit den zu vergleichenden Inhalten)

Grundsätzlich sind beide Tabellen (tabelle1, tabelle2) komplett identisch, es können eben Änderungen in der Übersetzung (spalte "text") vorkommen, die dokumentiert und ggf. angepasst werden müssen. Es kann z. B. auch sein, das in tabelle2 ganz neue "schluessel" dazugekommen sind oder eben in tabelle2 einige "schluessel" entfernt wurden, die es zuvor noch in tabelle1 gegeben hat, das gilt es auch herauszufinden.

Das größte Problem dabei sehe ich derzeit darin, das es keinerlei eindeutige id gibt. Zwar haben die Tabellen natürlich eine id spalte, die aber immer unterschiedlich sein kann (von Version zu Version), da es eine rein fortlaufende Zahl ist, die nicht fest mit einem schluessel verbunden ist. Daher muss der schluessel und das paket als referenz genutzt werden.

Ich hoffe, das man überhaupt durch sieht und jemand eine Idee hat, wie hier sinnvolle Abfragen möchlich sind, um die Unterschiede herauszufinden.

Rigoo
 
Könntest Du mal zwei Tabelleneinträge aus beiden Tabellen (neu/alt) zeigen?
Irgendwo wird man doch einen Ansatz für die Query finden :)

mfg chmee
 
etwa so?
SQL:
-- Alle aus t1 die in t2 nicht exisitieren
SELECT
	t1.paket,
	t1.schluessel,
	t1.text,
	'Fehlt in tablle2' AS state
FROM
	tabelle1 AS t1
	LEFT JOIN tabelle2 AS t2
		ON t1.paket = t2.paket
		AND t1.schluessel = t2.schluessel
WHERE
	t2.paket IS NULL
-- Alle aus t2 die in t1 nicht exisitieren	
UNION ALL
SELECT
	t1.paket,
	t1.schluessel,
	t1.text,
	'Neu in tablle2' AS state
FROM
	tabelle2 AS t2
	LEFT JOIN tabelle1 AS t1
		ON t1.paket = t2.paket
		AND t1.schluessel = t2.schluessel
WHERE
	t2.paket IS NULL
-- Alle von t1 die in t2 andere Texte haben	
UNION ALL
SELECT
	t1.paket,
	t1.schluessel,
	t1.text,
	'Unterschiedliche Texte in Tabelle1 und Tabelle2' AS state
FROM
	tabelle1 AS t1
	INNER JOIN tabelle2 AS t2
		ON t1.paket = t2.paket
		AND t1.schluessel = t2.schluessel
		AND t1.text <> t2.text
-- Alle identischen
UNION ALL
SELECT
	t1.paket,
	t1.schluessel,
	t1.text,
	'identisch in Tabelle1 und Tabelle2' AS state
FROM
	tabelle1 AS t1
	INNER JOIN tabelle2 AS t2
		ON t1.paket = t2.paket
		AND t1.schluessel = t2.schluessel
		AND t1.text = t2.text;
 
Zuletzt bearbeitet von einem Moderator:
Zurück