2009-09-26 3 views
2

J'ai une table (client) avec 20+ colonnes qui est principalement des données historiques.Comparaison de lignes dans le tableau pour les différences entre les champs

Quelque chose comme: id | clientID | field1 | field2 | etc ... | UpdateDate

Si mes données ressemble à ceci:

  
    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 

est-il un moyen facile de comparer chaque ligne et mettre en évidence les différences dans les domaines? Je dois pouvoir mettre en évidence les champs qui ont changé entre les révisions (sauf la clé et la date du cours)

Plusieurs champs peuvent être mis à jour dans chaque nouvelle ligne (ou une seule).

Ce serait client par client afin que je puisse sélectionner sur le clientID à filtrer.

Cela peut être du côté du serveur ou du client, ce qui est le plus facile.

Plus de détails j'étendre ma description un peu: Je cherche juste voir s'il y avait une différence entre les champs (est différent de quelque façon). Certaines données sont numériques, d'autres sont des textes, d'autres sont des dates. Un exemple plus complet pourrait être:

  
    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 

Je voudrais être en mesure de isplay chaque ligne pour clientID 12 et mettre en évidence B du rang 11 et C & Z de la ligne 19.

Répondre

0

Toute expression dans SQL doit référencer les colonnes en une seule ligne (sauf les sous-requêtes).

Un JOIN peut être utilisé pour créer deux rangées différentes dans une rangée du jeu de résultats.

Vous pouvez ainsi comparer des valeurs sur différentes lignes en effectuant une auto-jointure. Voici un exemple qui montre se joindre à chaque ligne à tous les rangs associés au même client (à l'exception d'une jointure d 'une ligne à lui-même):

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

Maintenant, vous pouvez écrire des expressions qui comparent les colonnes. Par exemple, pour limiter la requête ci-dessus à ceux où field1 se distingue:

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

Vous ne précisent pas quels types de comparaisons que vous devez faire, donc je vais laisser vous. Le point clé est qu'en général, vous pouvez utiliser une auto-jointure pour comparer les lignes d'une table donnée.


Re vos commentaires et éclaircissements: D'accord, donc votre est non seulement la « différence » en termes de valeur mais en position ordinale de la ligne. Rappelez-vous que les bases de données relationnelles n'ont pas de concept de numéro de ligne, elles ont uniquement un ordre de lignes par rapport à un ordre que vous devez spécifier dans une clause ORDER BY. Ne confondez pas le pseudo-code "id" avec le numéro de ligne, les numéros ne sont attribués comme croissant monotoniquement que par coïncidence de leur implémentation.

En MySQL, vous pouvez profiter de user-defined variables pour obtenir l'effet que vous recherchez.Commandez la requête par clientId puis par id et suivez les valeurs par colonne dans les variables utilisateur MySQL. Lorsque la valeur d'une ligne actuelle diffère de la valeur de la variable, faites ce que vous alliez faire. Je vais vous montrer un exemple pour un champ:

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; 

Notez cette solution n'est pas vraiment différent de simplement sélectionner toutes les lignes avec SQL plaine, et le suivi des valeurs des variables d'application que vous allez chercher les lignes.

+0

Merci Bill ... J'ai ajouté à la question pour vous aider à expliquer un peu mieux. Je dois être en mesure de voir toutes les lignes pour un client donné en même temps et de comparer tous les champs de la ligne ... – Jason

+0

Merci pour votre explication supplémentaire. Je pense que je dois revenir en arrière et essayer votre option ainsi que faire le suivi droit dans php rangée par rangée. – Jason

Questions connexes