Jag har denna lilla SQL-sats som räknar ihop antalet icke lästa blogg-inlägg: SELECT COUNT(id) FROM tbl_blogg LEFT JOIN tbl_blogg_reads ON tbl_blogg.id = tbl_blogg_reads.id WHERE user <> 'username' Så lätt är det inte... :) Det är lite svårt att lösa detta utan subselect. Kolla om detta är snabbare än ditt förslag: Jag har en "vanlig" omskriven membershipprovider efter en artikel på Pellesoft... Aha, nu fattar jag. Sorry med den. (Och förslaget när jag fattade problemet visade sig vara identiskt med Johans...) Vet inte om det funkar med JOINS men detta kanske är en lite effektivare fråga än din ursprungliga. Har dock inte testat den i mysql utan bara i Access. Denna fungerar utämrkt... Ofta är det bättre med JOIN, men det enda sättet att vara helt säker på är att testa vilket som går fortast i det specifika fallet.Räkna icke lästa blogg-inlägg
SELECT COUNT(id) FROM tbl_blogg WHERE id NOT IN (SELECT blogg_id FROM tbl_blogg_reads WHERE user = 'username')
Som ni kan se så har jag en SELECT-sats i min IN-sats som inte är riktig effektiv, men fyller sin funktion.
Hur kan man skriva om detta med hjälp av JOIN?
Har provat med:
SELECT COUNT(id) FROM tbl_blogg LEFT JOIN tbl_blogg_reads ON tbl_blogg.id = tbl_blogg_reads.id WHERE user = 'username'
Men då får jag bara ut alla poster som är lästa, utan jag vill ha de som är olästa... så att alla ID i tbl_blogg som inte finns med i tbl_blogg_reads vill jag då ha ut.Sv: Räkna icke lästa blogg-inlägg
där du får byta ut <> till det som är rätt, != eller ~= eller vad det kan vara. Eller för all del:
SELECT COUNT(id) FROM tbl_blogg LEFT JOIN tbl_blogg_reads ON tbl_blogg.id = tbl_blogg_reads.id WHERE not user = 'username' Sv:Räkna icke lästa blogg-inlägg
Jag måste plocka ut för en viss individ, om jag kör != 'username' så väljer den bort alla som är 'kalle' men jag kommer få med mig andra som läst inlägget oxå...Sv: Räkna icke lästa blogg-inlägg
SELECT COUNT(id) FROM tbl_blogg LEFT JOIN (SELECT id, user FROM tbl_blogg_reads WHERE user = 'username') AS r ON tbl_blogg.id = r.id WHERE r.user IS NULL
Tror man behöver joina in en tabell med alla användare för att lyckas utan en subselect... har du någon sådan tabell?
/JohanSv:Räkna icke lästa blogg-inlägg
Sv:Räkna icke lästa blogg-inlägg
Men då är frågan hur tung queryn är, har du verkligen så stora prestandaförluster där?
Det känns som att joina in hela användartabellen borde bli tyngre än en subselect.
Har de flesta läst det mesta kanske det är vettigare att vända på det; spara "unread" istället för "read"?Sv: Räkna icke lästa blogg-inlägg
Fråga som listar antalet ej lästa för respektive user.
SELECT tbl_blogg_reads.username, ((SELECT count(id) FROM tbl_blogg)-Count([bloggId])) AS NoReads
FROM tbl_blogg_reads
GROUP BY tbl_blogg_reads.username;
Fråga som visar ej lästa för en specifik användare
SELECT tbl_blogg_reads.username, ((SELECT count(id) FROM tbl_blogg)-Count([bloggId])) AS NoReads
FROM tbl_blogg_reads
GROUP BY tbl_blogg_reads.username
HAVING (((tbl_blogg_reads.username)="myUserName"));
eller utqan att returnera username
SELECT ((SELECT count(id) FROM tbl_blogg)-Count([bloggId])) AS NoReads
FROM tbl_blogg_reads
WHERE (((tbl_blogg_reads.username)="A"));Sv:Räkna icke lästa blogg-inlägg
SELECT COUNT(id) FROM tbl_blogg LEFT JOIN (SELECT id, user FROM tbl_blogg_reads WHERE user = 'username') AS r ON tbl_blogg.id = r.id WHERE r.user IS NULL
Varför jag inte vill köra med Subquery är efter denna artikel:
http://www.aspsidan.se/default.asp?page=readArticle&artId=615
Men det kanske inte är hållbart i alla lägen att det är bättre med JOIN... :)Sv: Räkna icke lästa blogg-inlägg
/Johan