2012-01-03 4 views
0

Tri de l'inverse de la recherche de lignes en double. J'ai une table avec un tas de colonnes, et je veux trouver où les données ne sont pas les mêmes dans deux colonnes. Alors ...Trouver des lignes où deux colonnes ne sont pas uniques dans MySQL?

Si j'ai ceci:

------------ 
col1 | col2 
------------ 
    A | 1 
------------ 
    A | 1 
------------ 
    A | 2 
------------ 
    B | 1 
------------ 
    B | 1 
------------ 
    B | 3 
------------ 
    B | 1 
------------ 

Je veux trouver ceci:

------------ 
col1 | col2 
------------ 
    A | 1 
------------ 
    A | 2 
------------ 
    B | 1 
------------ 
    B | 3 
------------ 

Mais si j'ai ceci:

------------ 
col1 | col2 
------------ 
    A | 1 
------------ 
    A | 1 
------------ 
    B | 1 
------------ 
    B | 1 
------------ 
    B | 1 
------------ 

Je veux trouver ce:

Empty set 
+1

Je ne suis pas sûr de comprendre - pourquoi votre deuxième exemple serait-il un ensemble vide? – benesch

+1

Je pense que vous avez besoin d'élaborer un peu sur vos besoins. – Flimzy

+0

Il est étrange que le deuxième exemple revienne vide, alors que le premier exemple contient les tuples '{A, 1}' et '{B, 1}'. S'il vous plaît, expliquez. – dasblinkenlight

Répondre

0

Si nous pouvons supposer que vous avez une colonne d'identification unique aussi, vous pouvez faire quelque chose comme

select * 
from the_table t 
where not exists (
    select 0 
    from the_table t2 
    where t.col1 = t2.col1 
    and t.col2 = t2.col2 
    and t.id < t2.id 
) 
+0

Notez que cela ne retournera pas l'ensemble vide pour le second exemple. Cela retournera (A, 1) et (B, 2). Je * pense * que c'est ce que vous vouliez dire. Faites-moi savoir si ce n'est pas – rejj

+0

C'est proche. Je ne comprends pas encore vraiment les sous-requêtes de MySQL. Mais oui, il ne doit rien retourner quand toutes les col2 sont identiques pour chaque groupe de col1. Merci pour l'aide! Je vais essayer de peaufiner un peu votre exemple ... peut-être que je peux le comprendre. – tonedef

-1

Vous pouvez utiliser:

Select col1, col2 
From tablename 
Group by col1, col2 
Having count(*) > 1; 

Cette solution renvoie des enregistrements dupliqués, comme demandé dans le dernier commentaire du propriétaire de question.

+0

qui ne fonctionnera pas - vous ne sélectionnez pas les valeurs uniques dans le premier exemple – rejj

+0

Cela ne retournera pas {{A, 1} 'et' {B, 1} 'pour le premier exemple. – dasblinkenlight

+0

Mais il n'aura pas de lignes où les données existent sur plus d'une ligne. Je pense que l'exemple est incompatible avec la description. –

0

cela fonctionne si l'utilisateur veut sélectionner une valeur supérieure à 1 mais si l'utilisateur veut avoir un vide si Col2 a la même valeur supérieure à 1, cette requête ne fonctionnera pas.

SELECT * FROM 
     (SELECT DISTINCT Col1, Col2 FROM tableName) as iQuery 
WHERE iQuery.Col2 > 1 
Questions connexes