• 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
 
Werbung:
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:
 
Werbung:
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).
 
Werbung:
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!! :)
 
Werbung:
Zurück
Oben