sql >> Databasteknik >  >> RDS >> Mysql

Jämför rader i tabell för skillnader mellan fält

Alla uttryck i SQL måste endast referera till kolumner i en rad (spärrar underfrågor).

En JOIN kan användas för att göra två olika rader till en rad i resultatuppsättningen.

Så du kan jämföra värden på olika rader genom att göra en självanslutning. Här är ett exempel som visar att varje rad ansluts till varannan rad som är associerad med samma klient (exklusive en koppling av en rad till sig själv):

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

Nu kan du skriva uttryck som jämför kolumner. Till exempel, för att begränsa ovanstående fråga till de där fält1 skiljer sig:

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

Du anger inte vilka typer av jämförelser du behöver göra, så jag överlåter det till dig. Det viktigaste är att du i allmänhet kan använda en självkoppling för att jämföra rader i en given tabell.

Om dina kommentarer och förtydligande:Okej, så din "skillnad" beror inte bara på värdet utan på radens ordningsposition. Kom ihåg att relationsdatabaser inte har ett koncept för radnummer, de har bara ordning på rader med avseende på någon ordning som du måste ange i en ORDER BY klausul. Blanda inte ihop "id " pseudo-nyckel med radnummer, siffrorna tilldelas som monotont ökande endast av slumpen att de implementeras.

I MySQL kan du dra fördel av användardefinierade variabler för att uppnå den effekt du letar efter. Beställ frågan efter clientId och sedan med id , och spåra värden per kolumn i MySQL-användarvariabler. När värdet i en aktuell rad skiljer sig från värdet i variabeln, gör vad som helst för att markera du skulle göra. Jag ska visa ett exempel för ett fält:

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;

Observera att den här lösningen egentligen inte skiljer sig från att bara välja alla rader med vanlig SQL och spåra värdena med applikationsvariabler när du hämtar rader.




  1. Ändra på Big Table i RDS Lösning till tabell fullt fel

  2. MySQL (eller PHP?) grupperar resultat efter fältdata

  3. Hur man skapar ett beräknat fält i Access

  4. CakePHP 3:Bästa praxis för tillfälliga SQL-tabeller