SQL Unterabfrage mit mehreren Ergebnissen

Jack159

Lieutenant
Registriert
Dez. 2011
Beiträge
766
Hallo,

Es geht um ein Freundschaftssystem in einem Soziales Netzwerk.

Ich habe 2 Tabellen:

user:
- id
- firstname
- lastname
....

friend_relationship:
- user_id_one
- user_id_two
- status

Die 1. Tabelle "user" dürfte selbsterklärend sein. Die 2. Tabelle "friend_relationship" ist dazu da, um Freundschaft(sanfragen) zu speichern. Beispielsweise gibt es 60 Einträge für user_id_one=2, welche alle auf unterschiedliche user_id_two-Werte verweisen (Das wären dann die Freundschaften).

Ich möchte mir jetzt zu einem bestimmten user (einer user-id) alle Namen seiner Freunde ausgeben lassen.
Gehen wir vom User mit der id=2 aus:

Code:
"SELECT firstname, lastname FROM user WHERE id=(SELECT user_two_id FROM friend_relationship WHERE user_one_id=2)";

Dabei erhalte ich den Fehler:
Subquery returns more than 1 row

Das leuchtet mir ein, aber ich weiß trozdem nicht, wie ich an mein Ziel komme....
 
Stichwort:

Joins

:)

Les dich da mal ein.
 
Du versuchst halt einen Subquery (Liste) einer ID (int) zuzuordnen. Dass es dort kracht, ist also logisch. Dein Unterfangen funktioniert also nur mit
Code:
WHERE id IN(<subquery>)
oder du machst es gleich richtig und gehst über die Zwischentabelle und nutzt außerdem Joins und kein Where.
Code:
SELECT
	u1.id,
	u1.firstname,
	u1.lastname,
	
	u2.id,
	u2.firstname,
	u2.lastname
FROM
	friend_relationship r
		JOIN user u1
			ON r.user_id_one = u1.id
		JOIN user u2
			ON r.user_id_two = u2.id
Holt dir die User über die Beziehungen in der Relationship-Tabelle.
 
So auf die schnelle zusammengeschrieben:

Code:
SELECT
	u.firstname,
	u.lastname
FROM
	user u,
	friend_relationship f
WHERE
	f.user_id_one = 2 AND
	f.user_id_two = u.id

Ich mag implizierte joins lieber, läßt sich leichter mit denken. ;-)
 
Du fragst nach einer Bedingung, die erfüllt sein soll (id = unterabfrageergebnis). Es geht da natürlich nicht, mehrere Bedingungen zu erfüllen. Wenn die id z.b. 5 sein soll, macht es keinen Sinn, dass die id dann noch 8 ist (ist nur ein Beispiel). Wenn du wie in deinem Beispiel jedoch eine Menge abfragen möchtest, macht man das mit "in".

Statt wehre id = ...
Wehre id in (Menge) verwenden.
 
Zurück
Oben