Ответ 1
очень злой и злой:
select distinct
least(foo, bar) as value1
, greatest(foo, bar) as value2
from table
Я хочу выбрать различные значения в базе данных. Позвольте мне привести вас на быстрый пример.
Таблица:
foo bar
--- ---
a c
c f
d a
c a
f c
a c
d a
a c
c a
f c
Верно, пусть мой SQL SELECT DISTINCT foo, bar from table
. Это мои результаты:
foo bar
--- ---
a c
c f
d a
c a
f c
Однако проблема заключается в том, что есть повторения a c
/c a
только в том, что они находятся в другом порядке. Я не хочу их выбирать, мне нужны разные значения из обоих столбцов, пожалуйста, помогите!
очень злой и злой:
select distinct
least(foo, bar) as value1
, greatest(foo, bar) as value2
from table
Как насчет использования GROUP BY?
SELECT foo,bar FROM my_table GROUP BY foo,bar
Как насчет:
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
Вы просите что-то противоположное симметричному замыканию (я не знаю, имеет ли оно специальное имя, антисимметричное что-то, так как это не замыкание). Для закрытия и закрытия, например, для сравнения двух разных столбцов, вы можете использовать объединения. Чтобы убедиться, что вы не отфильтровываете обе строки, когда они дублируются по столбцам, вам необходимо различать повторы и включать один из них, например, путем включения пары, где первая является меньшей.
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 )
Это работает для меня:
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
Итак, как я понял, вы хотите объединить 2 поля в одну строку результатов поиска SQL, поэтому я всегда так делаю, когда нужно (можно масштабировать с несколькими строками и несколькими таблицами):
ВЫБЕРИТЕ a.field1 ОТ (
ВЫБЕРИТЕ foo AS field1 ИЗ таблицыX
UNION
Панель SELECT AS field1 ИЗ таблицыX
)