• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

2 Spalten vereinen und via SELECT DISTINCT ausgeben

xSTVNx

Mitglied
Mir fehlen leider etwas die Worte, um mein Problem zu schildern, ich hoffe es ist trotzdem verständlich... :)

Ich habe eine Tabelle message. Die enthält unter anderem die Spalten message_from(INT10), message_to(INT10) und message_date(DATETIME).

Ich habe nun folgende Queries
Code:
SELECT DISTINCT message_from FROM message
und
Code:
SELECT DISTINCT message_to FROM message

Ich möchte diese beiden Queries bzw. message_from und message_to vereinen, so dass mir alle verschiedenen Werte ausgegeben werden, die in message_from oder message_to vorkommen.

Also quasi in diese Richtung, aber das ist nicht das, was ich brauche:

Code:
SELECT DISTINCT message_to, message_from FROM message ORDER BY message_date DESC

Danke schonmal!
xSTVNx
 
Ich würde es mal per Subselect probieren:

Code:
SELECT 
 (  
   SELECT DISTINCT message_from FROM message
 )
 (
   SELECT DISTINCT message_to FROM message
 )

Evtl. wäre auch UNION für dich interessant:

Code:
(  
   SELECT DISTINCT message_from FROM message
 ) UNION
 (
   SELECT DISTINCT message_to FROM message
 )
 
Danke! UNION ist/macht das, was ich suche.

Code:
(
  SELECT DISTINCT message_from
  FROM message
) UNION (
  SELECT DISTINCT message_to
  FROM message
)

Allerdings habe ich das Problem, dass ich es einfach nicht auf die Reihe bekomme, das Ganze nun noch via message_date DESC sortieren zu lassen.

Mir ist der richtige Syntax nicht schlüssig und alle probierten Varianten waren fehlerhaft. :???: (via phpmyadmin getestet)
Wo muss denn die SELECT- und ORDER-BY-Anweisung hin? (Falls man das so überhaupt braucht... ^^)

Kannst du mir bitte ein Beispiel geben? :lol:
 
Auch dafür gibt es imho mehrere Wege:

a)
Code:
SELECT DISTINCT * FROM (
  SELECT DISTINCT message_from
  FROM message
) UNION (
  SELECT DISTINCT message_to
  FROM message
)

b)
Code:
(
  SELECT DISTINCT message_from
  FROM message
) UNION ALL (
  SELECT DISTINCT message_to
  FROM message
)
 
Bei a) bekomme ich eine Fehlermeldung ("#1248 - Every derived table must have its own alias") und bei b) macht UNION ja etwas, was ich so gar nicht möchte. :/

Ich frag mal anders:

Code:
[COLOR=#333333]([/COLOR] SELECT DISTINCT message_from FROM message ) UNION ( SELECT DISTINCT message_to  FROM message ) ORDER BY message_date DESC
...geht ja logischerweise nicht, weil message_date nirgens deklariert wurde. Wo kann ich das denn jetzt machen?

Code:
SELECT * FROM [COLOR=#333333]([/COLOR] SELECT DISTINCT message_from  FROM message ) UNION ( SELECT DISTINCT message_to  FROM message ) ORDER BY message_date DESC
...ist ja auch falsch. Was ja irgendwie auch nachvollziehrbar ist... (selbe Fehlermeldung wie bei a) )

Aber ich check einfach nicht, was richtig ist. :/
 
Informiere dich mal über UNION: MySQL :: MySQL 5.0 Reference Manual :: 13.2.8.4 UNION Syntax

Dein ersterer Versuch ginge so:

Code:
[COLOR=#333333]([/COLOR] SELECT DISTINCT message_from, message_date FROM message ) UNION ( SELECT DISTINCT message_to, message_date  FROM message ) ORDER BY message_date DESC

Und für die Eindeutigkeit der Ergebnismenge könnte statt UNION ALL auch UNION DISTINCT helfen (siehe Manual).
 
UNION DISTINCT und UNION ALL helfen leider auch nicht.
Deine Variante hatte ich nun auch schon, kommt dem ganzen auch schon ziemlich nahe...;ugl

Code:
( SELECT DISTINCT message_from AS user_id, message_date FROM message ) UNION ( SELECT DISTINCT message_to, message_date  FROM message ) ORDER BY message_date DESC

Das macht nun folgende Ausgabe:


Nun sollte aber nur eine Zeile mit user_id "14" ausgeben werden, und zwar die letzte.

Also es soll quasi/scheinbar kein DISTINCT auf message_date angewandt werden, sondern message_date soll schlicht eben mit angezeigt werden, bei der Zeile, die durch DISTINCT message_from/message_to/user_id ausgegeben wird.:?:

(Ich frage mich gerade, ob das mit diesem Ansatz überhaupt gehen kann?)
 
Aktuell sortierst Du ja alle Datensätze raus die eindeutig sind. Wenn Du aber von der user_id 14 nur einen Datensatz haben willst, müsstest Du auch noch auf die user_id gruppieren.

Code:
( SELECT DISTINCT message_from AS user_id, message_date FROM message ) UNION ( SELECT DISTINCT message_to, message_date  FROM message ) GROUP BY user_id ORDER BY message_date DESC
 
Mit deinem Code erzeugt es bei mir 'ne Fehlermeldung?! oO

Aber mit dieser Variante gehts:
Code:
 ( SELECT DISTINCT message_from AS user_id, message_date FROM message GROUP BY user_id ) UNION ( SELECT DISTINCT message_to, message_date  FROM message  GROUP BY user_id ) ORDER BY message_date DESC

Das ist nun auch abschließend das, was ich gesucht habe. :D

Vielen Dank, threadi!! :)
 
Zurück
Oben