mySQL: Zwei Spalten sollen in der Summe keine Redundanz liefern...

SonMiko

Erfahrenes Mitglied
Hallo zusammen!

Mich plagt ein kleines Problem in einer mySQL Datenbankanfrage.
Es gibt 2 Tabellen: user und messages.

Die Tabelle "messages" beinhaltet sämtliche Nachrichten.
Dabei gibt es hier folgende Felder:
id, id_sender, id_receiver, message

Selbsterklärend werden über die Felder id_sender und id_receiver der Sender und Empfänger einer
Nachricht festgehalten.

Nun möchte ich gerne eine Liste für einen eingeloggten User ausgeben (user.id ist in der Session gespeichert),
welche alle Personen anzeigt mit denen jemals geschrieben wurde.

Das Problem hierbei ist, dass die Personen sowhl in der id_sender als auch id_receiver auftauchen können.
Wie kann ich hier nun eine Art "DISTINCT" erzeugen, so dass die Summe beider Spalten (id_sender und id_receiver) keinerlei redundanzen enthält?

Mein Ansatz:
Code:
SELECT
                            message.message,
                            u1.id AS u1id,
                            u1.user AS u1user,
                            u2.id AS u2id,
                            u2.user AS u2user,
                        FROM
                            message
                        LEFT JOIN
                            user AS u1
                        ON
                            message.id_sender=u1.id
                        LEFT JOIN
                            user AS u2
                        ON
                            message.id_receiver=u2.id
                        WHERE
                           (message.id_sender=1200
                        OR
                            message.id_receiver=1200)

Die 1200 steht für die ID des eingeloggten Benutzers.

Natürlich liefert diese Abfrage nun alle Messages mit den Joins der user wieder, was ich nicht brauchen kann.
Auch möchte ich ungerne in PHP Konstruktionen a la: in_array bei einer Schleife verwenden - sprich ich möchte
schon gerne eine saubere Abfrage.

Nur bekomm ichs mit meinem Wissensstand nicht hin.

Zuletzt hab ich mir die Funktion "IN" des mysql Handbuchs angesehen - ich bin sicher
dass sich damit etwas anstellen lässt, aber irgendwie hats noch nciht wirklich Klick gemacht.

Über Hilfe wäre ich super dankbar******

Viele liebe Grüße,

Mike
 
Du kriegst alle user_ids auf diese weise
SQL:
SELECT DISTINCT	id_sender AS user_id
FROM	message
WHERE	id_receiver = 1200
UNION DISTINCT
SELECT DISTINCT	id_receiver
FROM	message
WHERE	id_sender = 1200

Und so die ganzen User-Informationen
SQL:
SELECT DISTINCT
	u.id,
	u.user
FROM
	user
WHERE
	u.id IN  (
		SELECT	id_sender AS user_id
		FROM	message
		WHERE	id_receiver = 1200
		UNION
		SELECT	id_receiver
		FROM	message
		WHERE	id_sender = 1200
	)
 
Zuletzt bearbeitet von einem Moderator:
Okay vielen Dank :). Das klappt - aber nun stelle ich fest dass ich die Liste eigentlich noch nach einer Spalte (created_at) innerhalb der Tabelle message sortieren muss :-/...

Daran wirds nun scheitern oder?

Ich nutze gerade nur die 2. Abfrage, und sie klappt wunderbar, bis eben auf die Sortierung.

...Mein Ansatz hierzu:
SQL:
SELECT DISTINCT
    user.id,
    user.user,
    (SELECT created_at FROM message WHERE (id_sender = user.id AND id_receiver = 59) OR (id_receiver = user.id AND id_sender = 59) LIMIT 1) AS created_at
...der aber leider nichts ausgibt (da er länger als 60 Sekunden rödelt...)
 
Zuletzt bearbeitet von einem Moderator:
Annahme: Du willst nach der jeweils letzten Message sortieren.
Dann solltest du mit GROUP BY arbeiten damit du pro User das MAX() vom Datum ermitteln kannst:
SQL:
SELECT DISTINCT
	u.id,
	u.user
FROM
	(
		SELECT	created_at, 
				id_sender AS user_id
		FROM	message
		WHERE	id_receiver = 1200
		UNION
		SELECT	created_at,
				id_receiver
		FROM	message
		WHERE	id_sender = 1200
	) 				AS t
	INNER JOIN user AS u
		ON u.id = t.user_id
GROUP BY
	u.id,
	u.user
ORDER BY 
	MAX(t.created_at)
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück