Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Vergleichen von Zeilen in einer Tabelle auf Unterschiede zwischen Feldern

Jeder Ausdruck in SQL darf Spalten nur in einer Zeile referenzieren (mit Ausnahme von Unterabfragen).

Ein JOIN kann verwendet werden, um zwei verschiedene Zeilen zu einer Zeile der Ergebnismenge zu machen.

Sie können also Werte in verschiedenen Zeilen vergleichen, indem Sie einen Self-Join durchführen. Hier ist ein Beispiel, das zeigt, wie jede Zeile mit jeder anderen Zeile verbunden wird, die demselben Client zugeordnet ist (außer einer Verbindung einer Zeile mit sich selbst):

SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)

Jetzt können Sie Ausdrücke schreiben, die Spalten vergleichen. Um beispielsweise die obige Abfrage auf diejenigen zu beschränken, bei denen sich Feld1 unterscheidet:

SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
WHERE c1.field1 <> c2.field1;

Sie geben nicht an, welche Arten von Vergleichen Sie anstellen müssen, also überlasse ich das Ihnen. Der entscheidende Punkt ist, dass Sie im Allgemeinen einen Self-Join verwenden können, um Zeilen in einer bestimmten Tabelle zu vergleichen.

Zu Ihren Kommentaren und Klarstellungen:Okay, Ihr "Unterschied" besteht also nicht nur im Wert, sondern in der Ordnungsposition der Zeile. Denken Sie daran, dass relationale Datenbanken kein Konzept der Zeilennummer haben, sie haben nur die Reihenfolge der Zeilen in Bezug auf eine Reihenfolge, die Sie in einem ORDER BY angeben müssen Klausel. Verwechseln Sie nicht die "id "Pseudoschlüssel mit Zeilennummer, die Nummern werden nur durch Zufall ihrer Implementierung als monoton steigend zugeordnet.

In MySQL könnten Sie benutzerdefinierte Variablen um den gewünschten Effekt zu erzielen. Ordnen Sie die Abfrage nach clientId und dann nach id , und verfolgen Sie Werte pro Spalte in MySQL-Benutzervariablen. Wenn sich der Wert in einer aktuellen Zeile von dem Wert in der Variablen unterscheidet, führen Sie die Hervorhebung durch, die Sie tun wollten. Ich zeige ein Beispiel für ein Feld:

SET @clientid = -1, @field1 = '';
SELECT id, clientId, field1, @clientid, @field1,
  IF(@clientid <> clientid, 
    ((@clientid := clientid) AND (@field1 := field1)) = NULL,
    IF (@field1 <> field1, 
      (@field1 := field1), 
      NULL
    )
  ) AS field1_changed
FROM client c
ORDER BY clientId, id;

Beachten Sie, dass sich diese Lösung nicht wirklich davon unterscheidet, einfach alle Zeilen mit einfachem SQL auszuwählen und die Werte mit Anwendungsvariablen zu verfolgen, während Sie Zeilen abrufen.