2016-10-31 2 views
0

Ich finde Paar Zimmergenossen zusammen mit Zimmerinformationen. zur Zeit kann ich eine Tabelle wie untenMySQL Tabelle teilweise Redundanz

Beispiel erhalten:

- 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 

nicht sicher, wie die Redundanz zu löschen, wie ich eine Tabelle wie diese

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

Ich war mit einem Tisch beginnen wie dies

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

Vielen Dank!

+0

Schnelle Frage, ist die Reihenfolge, in der Sie die Mitbewohner zurückgeben wichtig (z. B. muss es 101 133 2a 1 Oder wäre 133 101 2a 1 auch akzeptabel)? – Ben

+1

Verwenden Sie für den Join keine Gleichheit, verwenden Sie einfach ein>. – xQbert

+0

To Ben: Nein, es ist egal. Ich muss nur bestimmte Paare von Mitbewohnern finden – Eugene

Antwort

0

Verwenden Sie kein Gleichheitszeichen auf dem Join für studentID, verwenden Sie stattdessen <oder>.

Dies funktioniert wirklich nur, wenn jedes Zimmer 1 oder 2 Mitbewohner haben kann. Wenn ein 3. vorhanden ist, müsste eine andere Lösung erzeugt werden.

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 

Das die T1.StudentID zwingt weniger zu sein als der T2.StudentID, damit der untere ID Student wird immer erste Ordnung und keine Doppelarbeit zu gewährleisten sein.

Left Join wurde verwendet, da ich nicht sicher war, ob einige Zimmer nur 1 Person hatten und ich nahm an, dass Sie diese wollten.

+0

Got it! Ich danke dir sehr! Übrigens, was soll ich benutzen, wenn mehr als zwei Leute ein Zimmer teilen? Selbst das ist bei meiner Frage nicht der Fall. – Eugene

+0

Das hängt von verschiedenen Faktoren ab, wie müssen Sie all diese Namen anzeigen? Wie viele Leute könnten in einem Raum sein (unbegrenzt?) Wenn nur 4 zu einem Raum du könntest einfach hinzufügen und T2.StuID xQbert

+0

Fensterfunktionen in anderen Datenbanken; wie zB Row_number() über (Partition nach Wohnheim, Raumordnung nach StuID) kann in mySQL mit Benutzervariablen simuliert werden. Diese ermöglichen es uns, die Zeilennummer für jeden Studenten in einer Wohnheim/Raum-Kombination zu generieren, und dann können wir diese Zeilennummern verwenden, um jeden Schüler einer separaten Spalte in der Ergebnismenge zuzuweisen. Wenn wir eine konstante Zahl haben (sagen wir 4), könnten wir eine 'Pivot'-Anweisung simulieren, um die Zeilen in Spalten umzuschalten. aber das erfordert eine bekannte Obergrenze der Schüler pro Zimmer. – xQbert

Verwandte Themen