Jakýkoli výraz v SQL musí odkazovat na sloupce pouze v jednom řádku (s vyloučením poddotazů).
A JOIN
lze použít k vytvoření dvou různých řádků do jednoho řádku sady výsledků.
Takže můžete porovnávat hodnoty na různých řádcích pomocí vlastního spojení. Zde je příklad, který ukazuje spojení každého řádku s každým dalším řádkem spojeným se stejným klientem (s výjimkou spojení řádku k sobě samému):
SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
Nyní můžete psát výrazy, které porovnávají sloupce. Chcete-li například omezit výše uvedený dotaz na ty, kde se pole1 liší:
SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
WHERE c1.field1 <> c2.field1;
Neuvádíte, jaké druhy srovnání potřebujete provést, takže to nechám na vás. Klíčovým bodem je, že obecně můžete použít vlastní spojení k porovnání řádků v dané tabulce.
K vašim komentářům a vysvětlení:Dobře, takže váš "rozdíl" není pouze hodnotou, ale ordinální pozicí řádku. Pamatujte, že relační databáze nemají koncept čísla řádku, mají pouze pořadí řádků s ohledem na nějaké pořadí, které musíte zadat v ORDER BY
doložka. Nezaměňujte „id
" pseudoklíč s číslem řádku, čísla jsou přiřazena jako monotónně rostoucí pouze shodou jejich implementace.
V MySQL můžete využít uživatelsky definované proměnné abyste dosáhli požadovaného efektu. Seřaďte dotaz podle clientId
a poté pomocí id
a sledovat hodnoty na sloupec v uživatelských proměnných MySQL. Když se hodnota v aktuálním řádku liší od hodnoty v proměnné, proveďte zvýraznění, které jste chtěli udělat. Ukážu příklad pro jedno pole:
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;
Všimněte si, že toto řešení se ve skutečnosti neliší od pouhého výběru všech řádků pomocí prostého SQL a sledování hodnot pomocí aplikačních proměnných při načítání řádků.