---
title: "Smartare sätt att göra det här på önskas :)"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/191976-smartare-sätt-att-göra-det-här-på-önskas"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "bassebhu"
published: "2014-02-01T20:29:58.000Z"
updated: "2014-02-04T06:03:12.000Z"
replies: 7
views: 786
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/191976-smartare-sätt-att-göra-det-här-på-önskas"
---

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

## #1 — bassebhu, 2014-02-01T20:29Z

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";
```

Permalänk: https://www.webforum.nu/p/191976

## #2 — Compusa, 2014-02-02T20:12Z

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?

Permalänk: https://www.webforum.nu/p/2315362

## #3 — bassebhu, 2014-02-02T20:14Z

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!

Permalänk: https://www.webforum.nu/p/2315363

## #4 — Compusa, 2014-02-02T20:32Z

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";
```

Permalänk: https://www.webforum.nu/p/2315365

## #5 — bassebhu, 2014-02-02T20:38Z

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!

Permalänk: https://www.webforum.nu/p/2315366

## #6 — Compusa, 2014-02-02T20:43Z

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.

Permalänk: https://www.webforum.nu/p/2315368

## #7 — bassebhu, 2014-02-03T22:08Z

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!

Permalänk: https://www.webforum.nu/p/2315382

## #8 — bassebhu, 2014-02-04T06:03Z

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

Permalänk: https://www.webforum.nu/p/2315383

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/191976-smartare-sätt-att-göra-det-här-på-önskas
