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