2016-10-31 3 views
0

Я нахожу пару соседей по комнате вместе с информацией о номере. в настоящее время я могу получить таблицу, как показано нижеMySQL частичная избыточность таблицы

Например:

- Id1 Id2 Dorm room 
- 101 133 2a 1 
- 121 154 1b 3 
- 218 584 3a 2 
- 133 101 2a 1 
- 584 218 3a 2 
- 154 121 1b 3 

не уверен, как очистить избыточность, как я хочу, таблица, как этот

- Id1 Id2 Dorm room 
- 101 133 2a 1 
- 154 121 1b 3 
- 218 584 3a 2 

Я начинал с таблицей, как это

- StuID Dorm room 
- 101 2a 1 
- 154 1b 3 
- 121 1b 3 
- ... 

Спасибо!

+0

Быстро вопрос, является ли порядок, в котором вы возвращаете вопрос соседей (например, должно быть 101 133 2a 1 или, возможно, будет 133 101 2a 1)? – Ben

+1

не используйте равенство в соединении, просто используйте a>. – xQbert

+0

Бен: нет, это не имеет значения. Мне просто нужно найти отличные пары соседей по комнате – Eugene

ответ

0

Не используйте равных для соединения для studentID, вместо этого используйте <или>.

Это действительно будет работать только в том случае, если в каждой комнате могут быть 1 или 2 соседи по комнате. если третий присутствует, нужно будет создать другое решение.

SELECT T1.StuID, T2.StuID, T1.Dorm, T1.Room 
FROM table T1 
LEFT JOIN Table T2 
on T1.Dorm = T2.Dorm 
and T1.Room = T2.Room 
and T1.StuID < T2.StuID 

Это заставляет T1.StudentID быть меньше, чем T2.StudentID, таким образом, нижний ID студент всегда будет первым обеспечение порядка и отсутствие дублирования.

Левое соединение использовалось, поскольку я был не уверен, что в некоторых комнатах только 1 человек, и я предположил, что вы этого хотели.

+0

Получил! Спасибо огромное! BTW просто любопытно, что я должен использовать, если в одной комнате более двух человек? Даже это не касается моего вопроса. – Eugene

+0

Это зависит от нескольких факторов, например, нужно ли отображать все эти имена? сколько людей может быть в комнате (без ограничений?) Если только 4 в комнату вы могли бы просто добавить и T2.StuID xQbert

+0

Функции окна в других базах данных; такие как «Row_number() over (раздел по общежитию, порядок номеров по StuID)», могут моделироваться в mySQL с использованием пользовательских переменных. Это позволяет нам сгенерировать номер строки для каждого учащегося в коммюнике общежития/комнаты, а затем мы можем использовать эти номера строк, чтобы назначить каждого ученика отдельному столбцу в результирующем наборе. если у нас есть постоянное число (скажем, 4), мы могли бы имитировать оператор 'Pivot' для переключения строк в столбцы. но для этого требуется известный верхний предел учащихся в номере. – xQbert

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