Alanlar arasındaki farkları tablo satırları Karşılaştırılması

1 Cevap php

Ben çoğunlukla tarihsel veriler 20 + sütunlu bir tablo (istemci) var.

Something like: id|clientID|field1|field2|etc...|updateDate

Benim verileri bu gibi görünüyorsa:

    
    10|12|A|A|...|2009-03-01
    11|12|A|B|...|2009-04-01
    19|12|C|B|...|2009-05-01
    21|14|X|Y|...|2009-06-11
    27|14|X|Z|...|2009-07-01

Is there an easy way to compare each row and highlight the differences in the fields? I need to be able to simply highlight the fields that changed between revisions (except for the key and the date of course)

(Sadece bir ya) her yeni satırda güncellenmiş çoklu alanlar olabilir.

Ben filtre ClientID seçtiğiniz böylece bu müşteri bazında bir istemci üzerinde olacaktır.

Bu hiç kolay bir sunucu veya istemci tarafında, üzerinde olabilir.

More details I should expand my description a little: I'm looking to just see if there was a difference between the fields (one is different in any way). Some of the data is numeric, some is text others are dates. A more complete example might be:

    
    10|12|A|A|F|G|H|I|J|...|2009-03-01
    11|12|A|B|F|G|H|I|J|...|2009-04-01
    19|12|C|B|F|G|Z|I|J|...|2009-05-01 ***
    21|14|X|Y|L|M|N|O|P|...|2009-06-11
    27|14|X|Z|L|M|N|O|P|...|2009-07-01

Ben İstemciKimliği 12 her satır isplay ve arkaya 11 ve C & B vurgulamak edebilmek isterdim Satır 19 Z.

1 Cevap

SQL herhangi bir ifade yalnızca bir satır sütunları (bağlaçlarıdır engelleme) başvurmalıdır.

A JOIN sonuç listesindeki bir satıra iki farklı satır yapmak için kullanılabilir.

Yani kendi kendine katılmak yaparak farklı satırlarda değerleri karşılaştırabilirsiniz. Burada (bir kendisine bir satır katılmak hariç) aynı müşteri ile ilişkili her satırda, her satır birleştirme gösteren bir örnek:

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

Şimdi sütunları karşılaştırabilirsiniz ifadeler yazabilirsiniz. Örneğin, farklı field1 burada kişilerce yukarıdaki sorgu sınırlamak için:

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

Eğer yapmak gerekir karşılaştırmalar ne tür belirtmek yok, bu yüzden sana bırakacağım. Anahtar nokta, genel olarak, belirli bir tablodaki bir karşılaştırmak Kendiyle satırları kullanabilirsiniz olmasıdır.


Görüş ve açıklama Re: Tamam, böylece "fark" sadece değeri ile değil fakat satır sıralı konumu değildir. Ilişkisel veritabanları satır sayısı bir kavram yok unutmayın, sadece bir ORDER BY fıkrasında belirtmelisiniz bazı sipariş ile ilgili satır sipariş var. Sıra numarası ile "id" pseudokey karıştırmayın etmeyin, sayıları yalnızca kendi uygulanması tesadüf artırılması gibi monoton olarak atanır.

MySQL, size aradığınız etkiyi elde etmek için user-defined variables yararlanabilir. clientId tarafından sorgu Sipariş ve ardından id tarafından ve MySQL kullanıcı değişkenleri de kolon başına değerleri izlemek. Bir akım satırda değeri değişken olarak değerinden farklıysa, ne yaparsanız yapın gittiğini vurgulayarak yok. Ben bir alan için bir örnek göstereceğim:

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;

Bu çözüm sadece düz SQL ile tüm satırları seçme ve satırlarını gibi uygulama değişkenleri ile değerlerini izleme gerçekten farklı olmadığını unutmayın.