MYSQL выбрать значения DISTINCT в двух столбцах - PullRequest
52 голосов
/ 19 июля 2011

Я хочу выбрать разные значения в базе данных.Позвольте мне привести вам краткий пример.

Таблица:

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, просто в другом порядке.Я не хочу выбирать их, мне нужны отличные значения из обоих столбцов, пожалуйста, помогите!

Ответы [ 8 ]

78 голосов
/ 05 апреля 2013

Как насчет использования GROUP BY?

SELECT foo,bar FROM my_table GROUP BY foo,bar

44 голосов
/ 19 июля 2011

очень, очень злой и злой:

select distinct
    least(foo, bar) as value1
  , greatest(foo, bar) as value2
from table
7 голосов
/ 19 июля 2011

Как насчет:

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
3 голосов
/ 19 июля 2011
   SELECT 
       foo, bar
   FROM tableX
   WHERE foo <= bar
 UNION 
   SELECT 
       bar, foo
   FROM tableX
   WHERE bar < foo
3 голосов
/ 19 июля 2011

Вы просите что-то, что противоположно симметричному замыканию (я не знаю, имеет ли оно специальное имя; что-то антисимметричное, поскольку это не замыкание).Для замыканий и замыканий, подобных вещам, в которых необходимо сравнивать два разных столбца, можно использовать объединения.Чтобы убедиться, что вы не отфильтровываете обе строки, когда они дублируются по столбцам, вам нужен способ дифференцирования повторов и включения одного из них, например, путем включения пары, где первая является меньшей.

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;
2 голосов
/ 19 июля 2011
SELECT DISTINCT foo, bar FROM table WHERE
CONCAT(',',foo,bar,) NOT IN ( SELECT CONCAT(',',bar,foo) FROM table )
1 голос
/ 24 ноября 2013

Это работает для меня:

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
0 голосов
/ 16 июля 2019

Итак, как я понял, вы хотите объединить 2 поля в одну строку результатов поиска SQL ... Большинство ответов здесь меня очень смущает.

Я всегда так делаю, когда нужно (можно масштабировать несколькими строками и несколькими таблицами):

ВЫБРАТЬ a.field1 ОТ (
ВЫБЕРИТЕ foo AS field1 ИЗ таблицыX
UNION
Панель SELECT AS field1 ИЗ таблицыX
)

OR

ВЫБЕРИТЕ DISTINCT a.field1 ОТ (
ВЫБЕРИТЕ foo КАК поле1, условия ОТ таблицыX
СОЮЗ ВСЕХ
Панель SELECT AS field1, условия ОТ таблицыX
) a WHERE a.conditions = 1 (добавлены дополнительные условия для фильтрации некоторых результатов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...