sql >> Database >  >> RDS >> Mysql

Rijen in tabel vergelijken voor verschillen tussen velden

Elke expressie in SQL mag slechts in één rij naar kolommen verwijzen (met uitzondering van subquery's).

Een JOIN kan worden gebruikt om twee verschillende rijen in één rij van de resultatenset te maken.

U kunt dus waarden op verschillende rijen vergelijken door een self-join uit te voeren. Hier is een voorbeeld van het samenvoegen van elke rij met elke andere rij die aan dezelfde client is gekoppeld (exclusief een samenvoeging van een rij aan zichzelf):

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

Nu kunt u uitdrukkingen schrijven die kolommen vergelijken. Om de bovenstaande zoekopdracht bijvoorbeeld te beperken tot die waarbij veld1 verschilt:

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

Je geeft niet aan wat voor soort vergelijkingen je moet maken, dus dat laat ik aan jou over. Het belangrijkste punt is dat je over het algemeen een self-join kunt gebruiken om rijen in een bepaalde tabel te vergelijken.

Over uw opmerkingen en verduidelijking:Oké, dus uw "verschil" is niet alleen door waarde, maar door ordinale positie van de rij. Onthoud dat relationele databases geen concept van rijnummer hebben, ze hebben alleen een volgorde van rijen met betrekking tot een volgorde die u moet specificeren in een ORDER BY clausule. Verwar de "id . niet " pseudokey met rijnummer, de nummers worden toegewezen als monotoon toenemend alleen bij toeval van hun implementatie.

In MySQL kunt u profiteren van door de gebruiker gedefinieerde variabelen om het gewenste effect te bereiken. Bestel de zoekopdracht op clientId en dan door id , en volg waarden per kolom in MySQL-gebruikersvariabelen. Wanneer de waarde in een huidige rij afwijkt van de waarde in de variabele, doe dan wat u wilt markeren. Ik zal een voorbeeld tonen voor één veld:

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;

Merk op dat deze oplossing niet echt verschilt van het selecteren van alle rijen met gewone SQL en het volgen van de waarden met toepassingsvariabelen terwijl u rijen ophaalt.




  1. Gebeurtenissen in javascript met volledige kalender uit de database invullen

  2. Opgeslagen procedures met MySQL Workbench

  3. Vorige waarde ophalen na update - MySql

  4. hoe de wf_java_deferred-wachtrij opnieuw op te bouwen