Zweimal gleiche Spalte, doppelte Einträge nicht anzeigen (MySQL)

Atalión

Mitglied
Hey!

Wir müssen für's Studium ein paar Übungen machen, bei einer komme ich aber einfach nicht weiter. Es gibt eine Datenbank mit Mitarbeitern, eine mit Hotels und eine, in der die Reisen der Mitarbeiter gespeichert sind. Jetzt sollen nur die Paare von Mitarbeitern ausgelesen werden, die im gleichen Hotel zur gleichen Zeit ihre Reise begonnen haben. Folgende Abfrage habe ich bereits:

Code:
SELECT		r1.Mitarbeiter AS Mitarbeiter1, r2.Mitarbeiter AS Mitarbeiter2, HName, r1.Beginndatum
FROM		reise AS r1, reise AS r2, hotel AS h, mitarbeiter AS m
WHERE		r1.Mitarbeiter = m.PNr AND r1.Hotel = h.HNr AND r2.Hotel = h.HNr
			AND r2.Mitarbeiter != r1.Mitarbeiter AND r1.Beginndatum = r2.Beginndatum;

Das Ergebnis ist soweit richtig, nur werden sie noch doppelt angezeigt, also

Mitarbeiter #1, Mitarbeiter #2, Hotel #1, 01.01.2012
Mitarbeiter #2, Mitarbeiter #1, Hotel #1, 01.01.2012

Das sind ja an sich die gleichen Datensätze, nur in vertauschter Auflistung, aber wir sollen sie nur einmal anzeigen lassen. Wie kann ich das machen?

LG,
Malte
 
Danke für die Antwort, das bringt nichts, dann sucht er trotzdem in der Mitarbeiter1-Spalte alle raus.. die Auflistung ist ja

#1, #2
#2, #1

also die gleichen Datensätze nur vertauscht aufgelistet. Wenn man Distinct nutzt, werden ja dennoch die #1 und #2 aus der ersten Spalte als einzelne Werte angesehen.
 
Wieso fragst du denn 2mal aus der gleichen Tabelle ab?
SQL:
FROM        reise AS r1, reise AS r2
Kannst du eventuell mal den Aufbau der Tabellen posten?
 
Der Prof hatte folgende Skizze an die Tafel gemalt, daraus hab ich mir das geschlossen mit dem zweimal Auslesen, weiß nicht, ob es da eine bessere Methode gibt:

Foto 08.11.12 09 24 26.jpg

Die Datenbankstruktur ist wie folgt:

  • Mitarbeiter (#PNr, Name, *ANr, Gehalt)
  • Abteilung (#ANr, AName)
  • Hotel (#HNr, HName, HKategorie, PLZ, Ort)
  • Reise (#*Mitarbeiter, #*Hotel, #Beginndatum, Dauer, Kosten)
(#=Primärschlüssel, *=Fremdschlüssel)
 
Keine Ahnung wie ihr das lösen solltet. Aber ich würde das ganz simple so lösen

Als Mitarbeiter1 nehem ich immer den 'Kleineren' und als Mitarbeiter2 den 'Grösseren'.
Das sieht dann so aus
#1, #2
#1, #2

Dann noch ein Distinct darüber und fertig

SQL:
SELECT DISTINCT
	LEAST(r1.Mitarbeiter, r2.Mitarbeiter) AS Mitarbeiter1, 
	GREATEST(r1.Mitarbeiter, r2.Mitarbeiter) AS Mitarbeiter2, 
	HName, 
	r1.Beginndatum
FROM
    reise AS r1, 
    reise AS r2, 
    hotel AS h, 
    mitarbeiter AS m
WHERE       
	r1.Mitarbeiter = m.PNr 
	AND r1.Hotel = h.HNr
	AND r2.Hotel = h.HNr
    AND r2.Mitarbeiter != r1.Mitarbeiter 
    AND r1.Beginndatum = r2.Beginndatum;
 
Zuletzt bearbeitet von einem Moderator:
Zurück