Każde wyrażenie w SQL musi odwoływać się do kolumn tylko w jednym wierszu (z wyłączeniem podzapytań).
JOIN
może być użyty do utworzenia dwóch różnych wierszy w jednym wierszu zestawu wyników.
Możesz więc porównać wartości w różnych wierszach, wykonując samosprzężenie. Oto przykład, który pokazuje łączenie każdego wiersza z każdym innym wierszem powiązanym z tym samym klientem (z wyłączeniem łączenia wiersza z samym sobą):
SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
Teraz możesz pisać wyrażenia porównujące kolumny. Na przykład, aby ograniczyć powyższe zapytanie do tych, w których pole 1 jest różne:
SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
WHERE c1.field1 <> c2.field1;
Nie określasz, jakich porównań musisz dokonać, więc zostawiam to Tobie. Kluczową kwestią jest to, że ogólnie możesz użyć sprzężenia samodzielnego do porównania wierszy w danej tabeli.
Odnieś się do twoich komentarzy i wyjaśnień:OK, więc twoja „różnica” nie jest po prostu wartością, ale porządkową pozycją rzędu. Pamiętaj, że relacyjne bazy danych nie mają pojęcia o numerze wierszy, mają tylko kolejność wierszy w odniesieniu do jakiejś kolejności, którą musisz określić w ORDER BY
klauzula. Nie myl „id
" pseudoklucz z numerem wiersza, numery są przypisywane jako monotonicznie rosnące tylko przez zbieg ich realizacji.
W MySQL możesz skorzystać ze zmiennych zdefiniowanych przez użytkownika aby osiągnąć pożądany efekt. Zamów zapytanie według clientId
a następnie przez id
i śledź wartości na kolumnę w zmiennych użytkownika MySQL. Gdy wartość w bieżącym wierszu różni się od wartości w zmiennej, zrób to, co chcesz podświetlić. Pokażę przykład dla jednego pola:
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;
Zauważ, że to rozwiązanie nie różni się tak naprawdę od wybrania wszystkich wierszy za pomocą zwykłego SQL i śledzenia wartości za pomocą zmiennych aplikacji podczas pobierania wierszy.