Gå til innhold

SQL-spørring mot 2(/3) tabeller - Problematikk


Anbefalte innlegg

Hei.

 

Sliter med å legge opp en spørring, hvor jeg har et "wall"system, vennesystem, og dette skal kobles opp i en enkelt spørring. NULL PROBELEM so far...

 

Men jeg ønsker samtidig å hente ut veggposter jeg/(brukeren selv) har skrevet selv. Del-løsningen jeg har bygd opp idag henter altså bare venners poster, dermed ønsker jeg litt hjelp til å lage en fungerende sprring for dette.

 

	$userid = $userdata['user_id']; //den brukeren som surfer/fører spørringen
$result = dbquery(
	"SELECT wall.*
	FROM wall AS wall
		INNER JOIN
		friends AS fs
		ON fs.fs_to = wall.post_writer
			AND fs.fs_user = '".$userid."'
			AND fs_accepted = '1'
	ORDER BY wall.post_date DESC
	LIMIT 0,40;"
);
while($view=dbarray($result)) {
	//Data føres er her. Ønsker mine/brukerens egene poster her OGSÅ.
}

dbarray og dbquery er bare aliaser/fuksjoner som fører standard spørring.

Brukertabellen er standard lagt opp user_id, user_name etc...

Endret av warpie
Lenke til kommentar
Videoannonse
Annonse

Du må legge til en join til etter den du har :) Du har alt wall.post_writer, så da kan du sette verdien av den = user_name i den andre joinen.

 

SELECT
*
FROM
X
INNER JOIN 1
INNER JOIN 2
ORDER / GROUP BY

 

Ser ikke hvordan det skal fungere. Problemet med en slik spørring er nå at den vil forsøke å joine begge, samtidig. Må jo nesten være enten join 1, eller join 2.. For ellers blir jeg nødt til å legge alle brukere inn i vennetabellen (noe som blir dumt...).

 

	
SELECT wall.*
FROM wall AS wall
INNER JOIN
friends AS fs
ON fs.fs_to = wall.post_writer
	AND fs.fs_user = '{$userid}'
	AND fs_accepted = '1'
INNER JOIN
users AS u
ON u.user_id = wall.post_writer
	AND u.user_id = '{$userid}'
ORDER BY post_date DESC
LIMIT 0,40;

En ser fort at dette resulterer i 0 rader! De motsier jo hverandre, JOIN1 spør etter BARE venners poster, mens JOIN2 spør etter BARE brukerens poster.

Fjerner jeg _ AND u.user_id = '{$userid}' _, så vil det bare skjekke om kompisen/vennen som har skrevet innlegget er en bruker...

 

EDIT:

Fikk til å gjøre det, tror det ble korrekt, om noen har noe å si på denne så for all del, spytt ut!

		
SELECT wall.*
FROM wall AS wall
LEFT JOIN
	friends AS fs
	ON fs.fs_to = wall.post_writer
		AND fs.fs_user = '".$userid."'
		AND fs_accepted = '1'
INNER JOIN
	users AS u
	ON u.user_id = wall.post_writer
		AND u.user_id = '".$userid."'
		OR u.user_id = fs.fs_user
ORDER BY post_date DESC
LIMIT 0,40;

Endret av warpie
Lenke til kommentar

EDIT:

Fikk til å gjøre det, tror det ble korrekt, om noen har noe å si på denne så for all del, spytt ut!

		
SELECT wall.*
FROM wall AS wall
LEFT JOIN
	friends AS fs
	ON fs.fs_to = wall.post_writer
		AND fs.fs_user = '".$userid."'
		AND fs_accepted = '1'
INNER JOIN
	users AS u
	ON u.user_id = wall.post_writer
		AND u.user_id = '".$userid."'
		OR u.user_id = fs.fs_user
ORDER BY post_date DESC
LIMIT 0,40;

 

Ser greit ut det der :)

 

Jeg syntes dette hørtes ut som en jobb for UNION smile.gif

UNION blir vel ikke riktig og bruke her? Vet ingenting om database-strukturen hans.

Lenke til kommentar
  • 2 uker senere...

Jeg synes dette høres ut som noe for en subquery

 

SELECT * FROM WallPosts
WHERE WallPosts.UserID IN (SELECT FriendID FROM FriendsTable WHERE UserID = 'CURRENT_USER_ID')
OR WallPosts.UserID = 'CURRENT_USER_ID'

 

Altså, det du gjør er å velge ut spørring fra tabellen med veggposter bastert på om posterens UserID er gjeldende bruker (CURRENT_USER_ID) eller om den finnes blandt alle FriendID i FriendsTable hvor UserID = CURRENT_USER_ID

 

Denne syntaksen virker for MSSQL. Jeg er litt usikker på hvordan underspørringer virker i MySQL, men konseptet bør være likt. Husk at hvis vennetabellen er veldig stor så kan der være fornuftig å legge en indeks på FriendsTable.UserID slik at denne spørringen ikke tar vinter og vår.

 

Håper det hjelper.

 

Edit: Jeg har stipulert følgende tabelstruktur

WallPosts
---------
ID // Unique identifier for any given wall post
UserID // Unique identifier linking any given wall post to a spesific user
Content // The contents of the wall post

FriendsTable
------------
ID // Unique iidentifier for any given friend relationship (not really necessary)
UserID // The ID of the person being friended
FriendID // The ID of the friend

 

Legg merke til at dette skjemaet tillater at en person er venn med en bruker uten at brukeren er venn med personen. Dette er ikke nødvendigvis ønskelig. Det kan være at du vil ha en User1ID og en User2ID slik at du kun har en oppføring for et venneforhold i vennetabellen. I såfall så trenger du to underspørringer for å finne alle instansene hvor CURRENT_USER_ID er User1ID og alle instansene hvor CURRENT_USER_ID er User2ID

Endret av BlueEAGLE
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...