uit meerdere tabellen selecteren

Status
Niet open voor verdere reacties.

Gforcer

Nieuwe gebruiker
Lid geworden
24 feb 2010
Berichten
3
hoi, ik heb een lastig maar hopelijk een makkelijk vraagje.

ik zal meteen beginnen met het beschrijven van mijn probleem:

ik heb deze 3 tabellen die ik aan elkaar wil koppelen:

vrienden:
id, user_id, vriend_id, accepted

comments:
id, profile_id, wuser_id, datetime, text

members:
id, profile_id, name


Met deze query kan ik alle gebruikers zien die ik als vrienden heb:
[sql]
SELECT DISTINCT a.naam, a.id, b.vriend_id
FROM members AS a
INNER JOIN vrienden AS b ON b.user_id = a.id
AND (
b.user_id = "1424"
OR b.vriend_id = "1424"
)
AND b.status = "2"
ORDER BY b.vriend_id
[/sql]
output:
naam id vriend_id
GForce 1424 82
GForce 1527 1424
GForce 1424 3931


Echter zou ik ook de comments tabel eraan willen koppelen, maar ik weet niet bepaald hoe. Telkens als ik iets probeer zie ik dezelfde comments meerdere malen als output komen.

in dit geval zou k het zo willen doen:

comments:
id, profile_id, wuser_id, datetime, text

naam id vriend_id
GForce 1424 82
GForce 1527 1424
GForce 1424 3931

(vriend_id = profile_id AND vriend_id<>"1424") OR (id = profile_id AND vriend_id<>"1424")

maar weet niet hoe ik deze query in dat andere query moet plakken/gebruiken :(.
 
Laatst bewerkt door een moderator:
In dit soort gevallen gebruik ik altijd views.
Code:
CREATE VIEW Vrienden_Comments AS
(SELECT * FROM (SELECT * FROM Vrienden UNION SELECT * FROM Comments) WHERE Vrienden.ID = Comments.ID)

(Query niet getest)
 
Hmm, misschien moest ik melden dat create view niet allowed was :p

#1142 - CREATE VIEW command denied to user 'name'@'mijn_ip_adres' for table 'vrienden_comments'
 
Je query wordt dan aardig complex, kan je niet echt veder helpen.
 
Hallo Gforcer,

Ik wil je wel helpen, maar vind je uitleg redelijk vaag. Je kan naar mijn idee beter beginnen met een tekstuele omschrijving met wat je precies wilt bereiken, en het niet gelijk vertalen naar de techniek. Dit zou mijn omschrijving zijn wanneer ik je vraag interpreteer:

Je wilt een resultset waarin alle vrienden van een gegeven lid (#) worden weergegeven, plus de berichten die ze hebben gestuurd naar het gegeven lid.

Ik wil wel even snel proberen uit te leggen hoe ik het zou doen. Ik kan de SQL niet testen en doe de laatste tijd niks meer met SQL, dus ik zou fouten kunnen maken.

Ik zou de omschrijving opdelen in de volgende stappen:

Je wilt een resultset met daarin alle vrienden van een gegeven lid. Dat zou ongeveer deze query worden:

[SQL]SELECT v.vriend_id
FROM leden AS l,
vrienden as v
WHERE l.id = v.user_id
AND l.id = #
AND v.geaccepteerd = 1[/SQL]

Nu heb je een resultset met alle id's van de vrienden van het gegeven lid, die je wil koppelen aan de gegevens van de members (neem ik aan). Hiervoor plaatsen we de query van hierboven (met alias 'vl') in een nieuwe query:

[SQL]
SELECT vl.vid, m.naam
FROM leden als l,
(SELECT v.vriend_id as vid
FROM leden AS l, vrienden as v
WHERE l.id = v.user_id
AND l.id = #
AND v.geaccepteerd = 1) as vl
WHERE m.id = vl.vid;
[/SQL]

Nu heb je een resultset met id en naam van alle vrienden van een gegeven lid, deze wil je ook nog koppelen aan de comments. Een comment moet als zender een id hebben dat overeenkomt met het id uit de query hierboven en als ontvanger het gegeven lid id (#). We plaatsen dus de bovenstaande resultset in een nieuwe query waarin we hem joinen met de commentaren tabel:

[SQL]
SELECT c.id, c.titel, vr.vrnaam
FROM commentaren AS c,
(SELECT vl.vid AS vrid, m.naam AS vrnaam
FROM leden als l,
(SELECT v.vriend_id as vid
FROM leden AS l, vrienden as v
WHERE l.id = v.user_id
AND l.id = #
AND v.geaccepteerd = 1) as vl
WHERE m.id = vl.vid) AS vr
WHERE c.zender = vr.vrid
AND c.ontvanger = #
[/SQL]


Als je nog vragen hebt, of tegen fouten aanloopt hoor ik het graag.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan