MYSQL sélectionne les valeurs DISTINCT dans deux colonnes

Je souhaite sélectionner des valeurs distinctes dans une firebase database. Laissez-moi vous donner un exemple rapide.

Table:

foo bar --- --- ac cf da ca fc ac da ac ca fc 

Bon, disons que mon SQL est SELECT DISTINCT foo, bar from table . Ce sont mes résultats:

 foo bar --- --- ac cf da ca fc 

Cependant, le problème est qu’il y a des répétitions de ac / ca juste qu’elles sont dans un ordre différent. Je ne veux pas les sélectionner, je veux des valeurs distinctes des deux colonnes, aidez-moi!

très très méchant et méchant:

 select distinct least(foo, bar) as value1 , greatest(foo, bar) as value2 from table 

Que diriez-vous d’utiliser GROUP BY?

SELECT foo,bar FROM my_table GROUP BY foo,bar

Que diriez-vous :

 SELECT DISTINCT a.foo,a.bar FROM table a LEFT JOIN table b ON a.foo=b.bar and a.bar=b.foo WHERE b.foo IS NULL AND b.bar IS NULL 

Vous demandez quelque chose qui est à l’opposé d’une fermeture symésortingque (je ne sais pas si elle a un nom spécial, quelque chose antisymésortingque, puisque ce n’est pas une fermeture). Pour les fermetures et les fermetures, par exemple lorsque vous devez comparer deux colonnes différentes, vous pouvez utiliser des jointures. Pour vous assurer de ne pas filtrer les deux lignes lorsqu’elles sont dupliquées entre les colonnes, vous devez différencier les répétitions et en inclure une, par exemple en incluant la paire dont la première est la moins importante.

 SELECT DISTINCT t1.foo, t1.bar FROM `table` t1 LEFT JOIN `table` t2 ON t1.foo=t2.bar AND t1.bar=t2.foo WHERE t2.foo IS NULL OR t1.foo <= t1.bar; 
  SELECT foo, bar FROM tableX WHERE foo <= bar UNION SELECT bar, foo FROM tableX WHERE bar < foo 
 SELECT DISTINCT foo, bar FROM table WHERE CONCAT(',',foo,bar,) NOT IN ( SELECT CONCAT(',',bar,foo) FROM table ) 

Cela fonctionne pour moi:

 SELECT DISTINCT LEAST(sub.foo, sub.bar) as value_1 , GREATEST(sub.foo, sub.bar) as value_2 FROM (SELECT a.foo ,a.bar FROM table a JOIN table b on a.foo = b.bar and a.bar = b.foo) sub 

Plus pour la réponse de nabuchodonossor.

Si vous devez sélectionner non seulement des valeurs distinctes. Veuillez utiliser GROUP BY comme ci-dessous.

 SELECT * GROUP BY least(foo, bar), greatest(foo, bar) FROM table; 

Ou si vous interrogez comme dans la réponse de nabuchodonossor, une valeur toujours faible de (foo, bar) sera présente dans value1 à cause de la fonction lower () et la plus grande sera présente dans value2 à cause de la fonction greatest () , donc si vous voulez garder comme il est, vous devez toujours utiliser GROUP BY ci-dessous.

 SELECT foo, bar GROUP BY least(foo, bar), greatest(foo, bar) FROM table;