SQL: Vennelister

Tags:    php sql mysql

Kære udviklere,

Nu sidder jeg og har lidt problemer med noget sql. Jeg vil lave et vennesystem som skal være brugerdefineret således at brugere kan blive venner med hinanden. Igen noget der burde være meget simpelt. Det virker også fint med at man kan være venner, men det øjeblik jeg skal have udskrevet "vennerne" på de gældende brugerprofiler bliver det et problem.

Et eksempel: bruger med ID 2 har ansøgt bruger med ID 1, og bruger med ID 1 har accepteret ansøgningen. Begge profiler skal have udskrevet hinandens ID/billede mm. Problemet er at på begge profiler får jeg udskrevet ID nummer 2, som jo er ansøgeren.

'friendship_user1' er ansøgeren

Min tabel ser således ud:
Fold kodeboks ind/udKode 


SQL for tabellen:
Fold kodeboks ind/udSQL kode 


Måden jeg prøver på at få udskrevet data'en på er således:
Fold kodeboks ind/udSQL kode 


Fold kodeboks ind/udPHP kode 


$user_id er ID'et som findes i $_GET["id"].

Jeg håber at der er nogle der kan hjælpe, og hvis jeg har forklaret det for dårligt så skriv det endelig :).



Indlæg senest redigeret d. 13.07.2012 16:27 af Bruger #16025
5 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Du er nok nød til at lave et par sub-selects for den situation:

Fold kodeboks ind/udSQL kode 




Indlæg senest redigeret d. 13.07.2012 19:48 af Bruger #10216
Forstår jeg dig ret i at, du vil kunne vise den enkelte brugers venneliste på profilen?

For så er det jo bare at have tabellen med alle relationer, og så fx. hvis man vil se alle bruger_1's venner, så vælge alle indlæg med bruger_1's id.


Fold kodeboks ind/udSQL kode 




Problemet er at der både er ansøger og modtager i samme tabel.

Eksempelvis har vi brugerne:

1
2
3
4
5

Ansøgninger således:

2 -> 3
3 -> 1
5 -> 1
4 -> 2

Ved "->" er venstre tal ansøgeren.

I tabellen hedder ansøgeren "friendship_user1" og modtager hedder "friendship_user2". Så vil overstående se således ud:

user1 | user2
2 ------- 3
3 ------- 1
5 ------- 1
4 ------- 2

Problemet ligger i at hvis vi nu siger at alle ansøgninger er accepteret, og vi kigger på "3"'s profil skulle der komme disse ud:

Bruger 2 og bruger 1

Men som jeg skriver i indlæget før, så kommer ID'et 2 op på både bruger 1 og bruger 2 hvor på bruger 1 skulle 2 komme frem, og omvendt.



Indlæg senest redigeret d. 13.07.2012 18:14 af Bruger #16025
Det virker! Der er bare en detalje der ikke fungerer:

Jeg har jo som sagt bruger 1 og bruger 2. Bruger 2 har ansøgt bruger 1. Lige nu vises bruger 2's brugernavn fint på bruger 1's profil. Men på bruger 2's profil kan man ikke se bruger 1.

Jeg har gjort følgende:

Fold kodeboks ind/udPHP kode 


...og $user_id er som sagt $_GET["id"]. Det virker næsten! :D


En lille bemærkning: Den udskriver kun et resultat selvom at der findes flere i tabellen. Den udskriver kun den første. - fixed til flere resultater :)



-----------------------------



Undskyld, min fejl. Det virker! Tusind tak skal du have. Det var kun grundet at den sidste INNER JOIN skulle ændres til LEFT JOIN. Men fejl :D



Indlæg senest redigeret d. 13.07.2012 20:50 af Bruger #16025
Jeg hjalp engang nogle venner med et lignende problem, hvor de blot ville hive en liste med ID'er på brugerens venner ud, men havde samme problem med at brugerens eget ID kunne stå i enten det ene eller det andet felt. De ville naturligvis gerne undgå at skulle have to rækker for hvert venskab.

Som alternativ til UNION i Michaels subselect benyttede jeg mig af en IF for at løse problemet, således:

Fold kodeboks ind/udSQL kode 


... hvor '?' repræsenterer brugerens eget ID.

Idéen er, først at reducere datasættet til en liste hvor brugeren selv indgår (hvilket opnås i WHERE-delen). Derefter tjekker IF-sætningen om brugerens eget ID står i det første felt. Gør det det, så står vennens ID nok i det andet felt. Hvis ikke, så står vennens ID i det første felt. På den måde opbygges en liste over brugerens venners ID'er.

Blot et lille alternativ.



t