webForumDet fria alternativet

Hämta allt från en tabell med count?

Databaser & SQL

10 svar · 441 visningar · startad av voigtann1

Medlem sedan juni 20019 519 inlägg
Frågan#1

Hej,

jag försökte lösa ett problem som jag tyckte kändes enkel från början, men fastnade längst vägen.

Jag har en access databas med följande struktur:
tag

  • TagId - Räknare
  • Tag - Text

tagpost

  • TagId - tal
  • PostId - Tal

Jag vill få ut allt ifrån tag men även en count där det är 1 eller 0 om PostId är ett specifikt tal

PostId = 1 så kanske vi har TagId 1 och 2, då vill jag få ut ett resultat som säger att:
tag.TagId
tag.Tag
TagCount(?) (1/0)

Gå detta att göra med access?

Medlem sedan dec. 20025 483 inlägg
#2

Så här?

select t.tagid, t.tag, iif(p.postid = <my_special_number>, 1, 0) as tagcount
from tag t inner join tagpost p ...
Medlem sedan dec. 20025 483 inlägg
#3

Så här?

select t.tagid, t.tag, iif(p.postid = <my_special_number>, 1, 0) as tagcount
from tag t inner join tagpost p ...
Medlem sedan juni 20019 519 inlägg
#4

Se där, nästan helt korrekt, verkar dock för de där iif-frågan stämmer så bli det 1 men den kör även en 0, så jag få dubbletter:

TagId	TagName	tagcount
1	Tag1	0
1	Tag1	1
2	Tag2	0
2	Tag2	1
3	Tag3	0
4	Tag4	0

Dock körde jag en LEFT JOIN, då om jag kör en vanlig join så få jag bara ut tag1 och tag2 två gånger. Kan bero på att man har andra idn än bara <my_special_number> i tagpost tabellen(?)

Medlem sedan dec. 20025 483 inlägg
#5

De två första raderna i resultatet innebär att tagid = 1 är kopplad till två poster i tagposttabellen: en av posterna har postid = <my_special_number> och den andra posten har postid = <något_annat>.

Kör du en left join enligt "tag left join tagpost" så får du ut taggar som inte är kopplade till poster. Med en inner join får du bara ut taggar som har en postkoppling. Sedan kanske du även har med något filter i where-satsen?

Medlem sedan juni 20019 519 inlägg
#6
SELECT t.TagId, t.TagName, iif(p.BlogId = 24, 1, 0) as tagcount
FROM  Tag AS t inner join PostsTag AS p ON p.TagId = t.TagId;

Och få resultatet:

TagId	TagName	tagcount
1	Tag1	0
1	Tag1	1
2	Tag2	0
2	Tag2	1

Men jag ha 4st "TagName"
Det önskade resultat jag vill ha är

TagId	TagName	tagcount
1	Tag1	1
2	Tag2	1
3	Tag3	0
4	Tag4	0

TagCount kan också vara null, bara att jag vet att om taggen finns med eller inte för presentation

Medlem sedan dec. 20025 483 inlägg
#7

Aha :)

Blir detta bättre månne:

SELECT 
	t.TagId, t.TagName, iif(p.BlogId is null, 0, 1) as tagcount
FROM  
	Tag AS t left join PostsTag AS p 
	ON 
	p.TagId = t.TagId and p.BlogId = 24
Medlem sedan aug. 20039 340 inlägg
#8

Vet inte om Access faktiskt klarar av COUNT och GROUP BY, men vad sägs om...

SELECT t.TagId, t.TagName, COUNT(p.BlogId) AS tagcount
FROM Tag AS t 
LEFT JOIN PostsTag AS p ON p.TagId = t.TagId AND p.BlogId = 24
GROUP BY t.TagId

Det allra bästa sättet vore dock att cacha hur många gånger en tag används i Tag-tabellen, för prestandans skull. Det beror ju dock på tabellens storlek och antalet besökare om det är värt besväret.

Medlem sedan juni 20019 519 inlägg
#9

@Peter S Får:

Join expression not supported.

(and p.BlogId = 24)

Medlem sedan aug. 20039 340 inlägg
#10
LEFT JOIN PostsTag AS p ON (p.TagId = t.TagId AND p.BlogId = 24)

...kanske?

Medlem sedan juni 20019 519 inlägg
#11

Usch så trög jag är, fungera kanon

båda frågorna fungera från nitro2k01 och Peter S

Det allra bästa sättet vore dock att cacha hur många gånger en tag används i Tag-tabellen, för prestandans skull. Det beror ju dock på tabellens storlek och antalet besökare om det är värt besväret.

Det är i admin jag vill lista alla taggar och se vilka som är markerade på en specifikt tråd, är inte intresserad över hur många gånger en tagg har använts (än) men det har jag i åtanke redan ;)

261 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)