varios campos mysql sql

campos - MYSQL selecciona valores DISTINCT en dos columnas



distinct mysql varios campos (8)

¿Qué hay de usar GROUP BY?

SELECT foo,bar FROM my_table GROUP BY foo,bar

Quiero seleccionar valores distintos en una base de datos. Déjame que te explique un ejemplo rápido.

Mesa:

foo bar --- --- a c c f d a c a f c a c d a a c c a f c

Bien, digamos que mi SQL es SELECT DISTINCT foo, bar from table . Estos son mis resultados:

foo bar --- --- a c c f d a c a f c

Sin embargo, el problema es que hay repeticiones de ac / ca simplemente que están en un orden diferente. No quiero seleccionar estos, quiero valores distintos de ambas columnas, ¡por favor ayuda!


Estás pidiendo algo que es lo contrario de un cierre simétrico (no sé si tiene un nombre especial; algo antisimétrico, ya que no es un cierre). Para los cierres y cierres, como las cosas en las que necesita comparar dos columnas diferentes, puede usar uniones. Para asegurarse de no filtrar ambas filas cuando están duplicadas en las columnas, necesita una manera de diferenciar las repeticiones e incluir una de ellas, como incluir el par donde la primera es la menor.

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;


Esto funciona para mí:

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


Más para la respuesta del nabuchodonossor.

Si tiene que seleccionar no solo valores distintos. Por favor use GROUP BY como se muestra abajo.

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

O si consulta como en la respuesta de nabuchodonossor, siempre estará presente un valor pequeño de (foo, bar) en value1 debido a la función menor () y la más grande estará presente en value2 debido a la función mayor () , así que si desea mantener orden como está todavía tiene que usar GRUPO POR uso a continuación.

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


Qué tal si :

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


muy muy malvado y malvado

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


SELECT DISTINCT foo, bar FROM table WHERE CONCAT('','',foo,bar,) NOT IN ( SELECT CONCAT('','',bar,foo) FROM table )


SELECT foo, bar FROM tableX WHERE foo <= bar UNION SELECT bar, foo FROM tableX WHERE bar < foo