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?
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.
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.
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.
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.
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'"
130 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe