webForumDet fria alternativet

Smartare sätt att göra det här på önskas :)

Databaser & SQL

7 svar · 757 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

Hej!

Jag har en aktivitetstabell där jag vill hämta vissa aktiviteter som ägt rum, men har lite funderingar över vilka JOINS jag ska använda.

I min aktivitetstabell sparar jag dels händelser för projekt, t.ex. att ett har skapats, raderats eller uppdaterats, men jag lagrar även att någon har loggat in. För projekten så måste users, projects och versions joinas. För inloggningarna måste bara users joinas. Det jag har just nu funkar med hjälp av en UNION, men det känns fel att ställa en så komplicerad fråga för att få fram inloggningarna och slå ihop dem med projekthändelserna. Notera att detta nedan är ett förenklat exempel för att inte överösa er här. Den innehåller egentligen tre gånger så många joins :)

Kan jag på ett enklare sätt ställa bara en SELECT eller i annat fall två sql-frågor, baka ihop dem och sortera på det gemensamma ac_datetime utan att inloggnings-frågan ens tänker på allt det andra?

Stort tack för hjälp!

$fields = "ac_id, ac_p_id, ac_v_id, ac_m_id, ac_n_id, ac_u_id, ac_type, u_name, p_title, v_id, m_name, n_title";

	$sql = "SELECT $fields
			FROM activity
				INNER JOIN users
					ON u_id = ac_user_id
				INNER JOIN projects
					ON p_id = ac_p_id
				INNER JOIN versions
					ON v_id = ac_v_id
				LEFT JOIN media
					ON m_id = ac_m_id
				LEFT JOIN notes
					ON n_id = ac_n_id
			WHERE NOT (ac_visibility = 9)

		UNION

		SELECT $fields
			FROM activity
				INNER JOIN users
					ON u_id = ac_user_id
				LEFT JOIN projects
					ON p_id = ac_p_id
				LEFT JOIN versions
					ON v_id = ac_v_id
				LEFT JOIN media
					ON m_id = ac_m_id
				LEFT JOIN notes
					ON n_id = ac_n_id
			WHERE NOT (ac_visibility = 9) AND ac_type = 'login'
		ORDER BY ac_datetime DESC
		LIMIT 0,50";
Medlem sedan jan. 20023 327 inlägg
#2

Jag tycker det ser ut som du kör två identiska frågor som du sedan kör en union på, eller missar jag något?

Medlem sedan nov. 20016 480 inlägg
#3

Med skillnaden att den andra har två LEFT JOINS i stället för INNER JOINS. Glömde dock att specificera en where i den andra. Kolla gärna igen. Tack!

Medlem sedan jan. 20023 327 inlägg
#4

Sorry, jag som var lite blind :)

Kanske något i den här stilen om jag förstått det rätt? Kanske inte exakt det du vill åstadkomma men jag tror att det är en join i den stilen du behöver göra. Du behöver antagligen fixa till din SELECT också...

	$sql = "SELECT $fields
			FROM activity
				INNER JOIN users
					ON u_id = ac_user_id
                                [B]INNER JOIN users AS login
                                        ON login.u_id = ac_user_id AND ac_type = 'login'[/B]
				INNER JOIN projects
					ON p_id = ac_p_id
				INNER JOIN versions
					ON v_id = ac_v_id
				LEFT JOIN media
					ON m_id = ac_m_id
				LEFT JOIN notes
					ON n_id = ac_n_id
			WHERE NOT (ac_visibility = 9)
		ORDER BY ac_datetime DESC
		LIMIT 0,50";
Medlem sedan nov. 20016 480 inlägg
#5

Ska prova, tack!

Det jag vill göra är "hämta alla projekthändelser där dessa tre värden måste finnas och två kan vara frivilliga samt hämta alla användare som loggat in och sen visa dem tillsammans i datumordning". Kommer den nya INNER JOIN users AS login göra detta eller kommer den nu att vilja ha en login kopplad till projekthändelserna?

Testar och återkommer!

Medlem sedan jan. 20023 327 inlägg
#6

Osäker på det :)

Behöver nog få en bättre beskrivning på tabellerna ser ut och hänger ihop, samt ett exempel på hur du skulle vilja att resultatet såg ut.

Medlem sedan nov. 20016 480 inlägg
#7

Jag bantar ner det hela lite. Kan man köra en if-fråga om det ska vara INNER JOIN? Typ såhär:

$sql = "SELECT $fields
	FROM activity
	INNER JOIN users
		ON u_id = ac_user_id
	if (p_id IS NOT NULL) INNER JOIN projects ON p_id = ac_p_id AND p_visibility NOT (p_visibility = 9)
	WHERE NOT (ac_visibility = 9)
	ORDER BY ac_datetime DESC
	LIMIT 0,50";

Eller kanske till och med skippa LEFT JOIN och bara köra INNER JOIN om p_id inte är NULL. Det jag vill göra är att hämta projektdatan om det är en aktivitet för projekt (p_id är angivet), annars är det en login och projektdata ska inte hämtas.

Om detta är möjligt antar jag att nån typ av if-sats måste till även för mina $fields.
Detta borde vara enkelt, hm.

Tack!

Medlem sedan nov. 20016 480 inlägg
#8

hehe, jag tror att jag kanske har löst det, med en SQL-fråga och typ 50 AND och OR :birp

269 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
131 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)