---
title: "Flera JOIN problematiskt"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/109894-flera-join-problematiskt"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Marcus E"
published: "2004-08-23T21:01:58.000Z"
updated: "2004-08-24T17:28:49.000Z"
replies: 7
views: 295
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/109894-flera-join-problematiskt"
---

# Flera JOIN problematiskt

## #1 — Marcus E, 2004-08-23T21:01Z

Jag har denna fråga:

```
SELECT Category.*, COUNT(Category2.ID) AS CategoryCount, COUNT(Product.ID) AS ProductCount
				FROM Category
				LEFT JOIN Product ON FIND_IN_SET(Category.ID, Product.CategoryIDs)
				LEFT JOIN Category AS Category2 ON FIND_IN_SET(Category.ID, Category2.CategoryIDs)
				WHERE Category.ParentID=0
				GROUP BY Category.ID;
```

COUNT-värdena blir för stora när båda JOIN-satserna används samtidigt. Det beror nog på att alla tre tabeller förenas med varandra innan de grupperas. Jag behöver en gruppering innan den andra JOIN-satsen körs. Hur löser man det?

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

## #2 — aasah, 2004-08-23T23:23Z

Med en temporär tabell. Slå ihop de två tabellerna, gruppera och spara resultatet i en tabell temp. Använd sedan temp till att slå ihop med den tredje. Om jag förstår frågan rätt....

Passa alltså på att räkna i första steget, dvs innan du sparar i temp.

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

## #3 — Marcus E, 2004-08-24T10:39Z

Ja, jag tänkte just det. Frågan är om det är den smartaste lösningen. Fast det är det nog eftersom jag kan klämma in en WHERE-sats där också som bara påverkar den föreningen.

```
CREATE TEMPORARY TABLE tmp (
        CategoryID INT(4) UNSIGNED NOT NULL,
        ProductCount  INT(4) UNSIGNED NOT NULL);

INSERT into tmp SELECT Category.ID, COUNT(Product.ID) AS ProductCount
				FROM Category
				INNER JOIN Product ON FIND_IN_SET(Category.ID, Product.CategoryIDs)
				INNER JOIN User ON Product.UserID=User.ID
				WHERE Category.ParentID=0 AND User.ID = 1
				GROUP BY Category.ID;

SELECT Category.*, COUNT(Category2.ID) AS CategoryCount, tmp.ProductCount
				FROM Category
				LEFT JOIN Category AS Category2 ON FIND_IN_SET(Category.ID, Category2.CategoryIDs)
				LEFT JOIN tmp ON Category.ID=tmp.CategoryID

				WHERE Category.ParentID=0
				GROUP BY Category.ID;
DROP TABLE tmp;
```

Nu är frågan. Drar detta mycket prestanda? Den temporära tabellen skrivs ju inte till sekundärminnet så det lär inte ta alltför lång tid.

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

## #4 — OveRRidE, 2004-08-24T10:58Z

Jag kan inte tänka mig att temporärminnestabeller tar så lång tid att hantera. 

Är det MSSQL? Varför inte mäta dem med Query Analyzern? Då ser du ju direkt vad det är som tar tid, hur lång tid det tar, hur stor del av fråga som respektive exekvering kostar osv osv.

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

## #5 — Marcus E, 2004-08-24T11:04Z

MySQL är det. MS SQL byter jag till när jag har råd. :)

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

## #6 — OveRRidE, 2004-08-24T11:09Z

Aj då, jag lider med dig. ;)

Hur ofta kommer frågan köras då? Du har ju inga inparametrar enligt vad jag ser, så den borde ju kunna cachas ganska hårt om nu MySQL har stöd för cache av exekveringsplaner.

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

## #7 — Marcus E, 2004-08-24T12:56Z

Den kommer att köras varje gång man vill visa kategorier. Det kommer man att vilja göra ofta.

Det finns två inparametrar. De är efter WHERE-satserna.
WHERE Category.ParentID=@CategoryID AND User.ID = @UserID

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

## #8 — Marcus E, 2004-08-24T17:28Z

Jag provade att byta ut alla JOIN x ON mot JOIN x USING. Det gick inte, varför?

```
SELECT ...
INNER JOIN User USING(UserID)"
LEFT JOIN Bid USING(BidID)

SELECT ...
INNER JOIN User USING(UserID)"
LEFT JOIN Bid ON Bid.BidID = Product.BidID"
```

I manualen står det att dessa ska vara exakt lika. Trots det get den första. "Unknown User.BidID' in 'on clause'"

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/109894-flera-join-problematiskt
