2014-02-04 3 views
0

У меня есть небольшая трудность с написанием запроса:MySql не выбрать несколько столбцов уникального ряд

Я следующей таблицей:

ID | FromId | ToId 
-------------------------- 
1   10   15 
2   10   15 
3   15   10 
4   15   10 
5   15   20 
6   14   15 
7   20   15 
8   20   10 
9   10   20 
10  10   1 

Нет, я хотел бы получить здесь уникальный Wich имеет значение 10

И уникальным я имею в виду, например, в результате которых я хотел бы достичь, если переменная 10

FromId | ToId 
------------------ 
10   15 
20   10 
10    1 

Я конечно не уверен, если это возможно, чтобы сделать что-то вроде этого Тхо ...

Для меня в этом случае

10 20 == 20 10 

Но для SQL нет:/

Я думаю госзакупках DonT понять меня укомплектовать ...

мне нужна уникальность в сочетании с 10

ответ

3

Вы можете сделать это так:

select least(fromId, toId) as fromId, greatest(fromId, toId) as toId 
from MyTable t 
where fromId = 10 or toId = 10 
group by least(fromId, toId), greatest(fromId, toId); 

EDIT:

(В ответ на ваш вопрос о производительности.)

Вы должны иметь индексы fromId и toId.

Ваши исходные данные имеют повторяющиеся значения, поэтому дубликаты должны быть удалены. В MySQL это требует сортировки данных либо с помощью явного order by, либо с помощью group by (и связанного с ним файла). Вышеуказанный запрос должен выполняться так же, как и любой запрос, который использует distinct.

Если у вас есть два индекса, на t(fromId, toId) и t(toId, fromId) тогда следующий может работать лучше:

select distinct fromId, toId 
from MyTable t 
where fromId = 10 
union all 
select distinct fromId, toId 
from MyTable t 
where toId = 10 and 
     not exists (select 1 from MyTable t2 where t2.fromId = t.fromId and t2.toId = t.fromId); 

MySQL может выполнять distinct путем сканирования индекса. Я не уверен, что это происходит на практике.

+0

Я ничего не могу поделать. Мне просто не нравится внешний вид. – Strawberry

+0

что это с наименьшим и самым большим? – Alnedru

+0

@Alnedru. , , Вы хотите вернуть одну строку для каждой пары значений. Эти функции с агрегацией используются для удаления дубликатов. –

2

Я думаю, что это должно работать,

SELECT * FROM myTable WHERE FromId = 10 OR ToId = 10; 
Смежные вопросы