[PHP/SQL] Probleem DB Inner join ?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 673273

Topicstarter
Beste tweakers,

Het lukt maar niet om mijn probleem op te lossen.
Ik heb twee tabellen met de volgende gegevens. (Dit is een voorbeeld, dus de gegevens zijn verzonnen):

Tabel: follows
| id | volger | volgend |
-----------------------------
| 1 | Henk | Piet |
| 2 | Jan | Henk |
| 3 | Piet | Henk |

Tabel: posts
| id | naam | bericht |
------------------------------------
| 1 | Henk | Testbericht 1 |
| 2 | Henk | Testbericht 2 |
| 3 | Piet | Testbericht 3 |

Je moet alleen berichten kunnen lezen van de personen die je volgt. Dus Jan en Piet kunnen alleen berichten van Henk lezen en Henk kan alleen berichten van Piet lezen. Dit betekent dat Jan en Piet de twee berichten van Henk kunnen lezen en dat Henk één bericht van Piet kan lezen.

$_SESSION['username'] staat ingesteld op de ingelogde gebruiker. Stel dat Jan is ingelogd.

Hier loop ik vast, hieronder staat wat ik denk dat er moet gebeuren. Ik vind het lastig om uit te leggen.

Dan moeten alle berichten worden weergegeven waarbij $_SESSION['username'] gelijk is aan follows['volger'], en als die voorwaarde klopt, moet follows['volgend'] gelijk zijn aan posts['naam']. Die berichten moeten laten zien worden.


Ik denk dat ik hierbij inner join bij nodig heb..
Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • TweakMDS
  • Registratie: Mei 2002
  • Laatst online: 21-07 15:35
Deze vraag kan op een hoop manieren beantwoord worden. Ik denk dat het belangrijkste is om eerst eens goed naar normaliseren van je datamodel te kijken.
Denk aan:
Tabel users (userId, userName, ...)
Tabel posts (postId, userId, postText, ...)
Tabel follows (userId, followedUserId)

Op deze manier haal je de userId op in de sessie, en zoek je dan de posts van de volgers op, gejoined met follows; bijvoorbeeld:

SELECT
p.postText
, fu.userName AS [followedUserName]
FROM posts p
INNER JOIN follows f
ON p.userId = f.followedUserId
INNER JOIN users fu
ON f.followedUserId = fu.userId
WHERE f.userId = @userId

Met je huidige datamodel kan je uiteraard hetzelfde bereiken op een vergelijkbare manier.

SELECT
p.bericht
, p.naam
FROM posts p
INNER JOIN follows f
ON f.volgend = p.naam
WHERE f.volger = @userName (dus je variabele $_SESSION['username']).

[ Voor 10% gewijzigd door TweakMDS op 14-06-2015 13:02 ]


Acties:
  • 0 Henk 'm!

Anoniem: 673273

Topicstarter
Bedankt! Dit heeft geholpen!

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Pssst, ik win er niets bij, maar soms helpt het om een Fiddle te bouwen: http://sqlfiddle.com/

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 01:33

The Eagle

I wear my sunglasses at night

Als je het ect quick & dirty wilt hebben: gewoon een IN gebruiken :)

select * from posts where naam in (select volgend from followers where volger=$Session_username)

:)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
als je JOINs lastig vind kun je (naast leren hoe JOINS werken) natuurlijk ook gewoon in je PHP code twee aparte queries maken. Eerst haal je alle ids op van de personen die de ingelogde persoon volgt. En daarna haal je van al die personen de berichten op.

Acties:
  • 0 Henk 'm!

  • TweakMDS
  • Registratie: Mei 2002
  • Laatst online: 21-07 15:35
Misschien wat off-topic, maar omdat ik het gevoel hebt dat je hier nieuw mee bent nog één tip achteraf:
Gebruik voor zover je dat nog niet hebt gedaan parameterized queries / prepared statements. Daarmee voorkom je een hoop SQL injection risico's en is je performance mogelijk ook beter.
Als je namelijk sql queries gaat opbouwen door gebruikersinvoer aan elkaar te plakken kan er een heleboel mis gaan.

Zie: http://php.net/manual/en/pdo.prepared-statements.php

Acties:
  • 0 Henk 'm!

  • Jogai
  • Registratie: Juni 2004
  • Laatst online: 22-07 23:50
Als je niet weet of je een join kan gebruiken is hier een handige guide:
Afbeeldingslocatie: http://i.stack.imgur.com/udQpD.jpg
en hier meer achtergrondinfo: http://blog.codinghorror....explanation-of-sql-joins/

Klik hier om op linkedIn lid te worden van de Freelance Tweakers groep.


Acties:
  • 0 Henk 'm!

  • Pascal081
  • Registratie: December 2013
  • Laatst online: 27-11-2024
SndBastard heeft gelijk. Je moet eerst je datastructuur op orde hebben. Gebruik vooral nooit namen om data in tabellen aan elkaar te linken, maar altijd een primary key in de vorm van een integer (dus 1 voor Henk, 2 voor Jan en 3 voor Piet). Dit maakt je tabellen voor jouw misschien minder leesbaar, maar voorkomt een hoop problemen als je dataset groter wordt.

Als je JOINS wilt oefenen kun je het beste eens wat kloten met deze fiddle.

De cheatsheet met Venn diagrammen die Jogai posste kan erg nuttig zijn, maar daarvoor moet je misschien je eerst nog wat meer verdiepen in de theorie achter de JOINs.

Verder zou ik nooit aanraden om met IN te werken in deze situatie. Een dataset kan snel groeien en IN is niet bedoelt voor een grote input.
Pagina: 1