sql >> Databáze >  >> RDS >> Mysql

Porovnání řádků v tabulce pro rozdíly mezi poli

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ů.




  1. Laravel poskytuje jiný výstup než dotaz MySQL

  2. Skupina DateTime podle data a hodiny

  3. Importujte data z tabulky Excel nebo CVS do MySQL

  4. Uložte PHP kód na MySQL a spusťte jej