2014-11-22 2 views
0

Мне нужен запрос, который соединяет пользователя по критериям. Запрос вернет динамическое количество строк, равное количеству пар, которые соответствуют критериям. Запрос возвращает два поля: id1 и id2, каждый из которых является идентификатором пользователя. Как создать запрос, чтобы идентификаторы не отображались снова в другой строке?Взаимно эксклюзивные пары

Пример того, что я хочу вернулся:

id1 id2 
001 003 
004 006 
009 011 
023 042 

Пример того, что я не хотите вернулся:

id1 id2 
001 003 
003 004 
012 002 
023 012 

ответ

1

Если я правильно понимаю, у вас есть какой-то таблицы, скажем Users, и вы хотите подключить пользователей. У вас также может быть пункт where или другие критерии.

Вы действительно можете это сделать. Перечислим строки, а затем сделать условной агрегации на основе сочетания соседних четных и нечетных значений:

select min(u.userid) as userid1, max(u.userid) as userid2 
from (select u.*, (@rn := @rn + 1) as seqnum 
     from users u cross join 
      (select @rn := 0) vars 
    ) u 
group by floor((seqnum - 1)/2) 
having userid1 <> userid2; 

Вы можете легко добавить пункт where в подзапросе.

+0

Используя этот запрос, он просто выводит идентификатор каждого пользователя в обоих полях. Я предполагаю, что вы имеете в виду 'group by floor ((seqnum-1)/2)', который объединяет четный/нечетный, но, в моем случае, возвращает последнего пользователя дважды как пару себя ex. id1: 199 id2: также 199. Я исправил это, добавив «наличие id2> id1' и, похоже, работает. Мне нужно проверить его с помощью критериев. – user1210725

Смежные вопросы