webForumDet fria alternativet

problem med distinct

Databaser & SQL

7 svar · 659 visningar · startad av Vinnaren

Medlem sedan sep. 2005833 inlägg
Frågan#1

har följande:

SELECT DISTINCT(c.CategoryId), c.Name, isnull(p.PostId, 0) AS PostId,
(SELECT COUNT(PostId) FROM forum_Post WHERE CategoryId = c.CategoryId AND ParentPostId = 0) AS Topics,
(SELECT COUNT(PostId) FROM forum_Post WHERE CategoryId = c.CategoryId AND ParentPostId != 0) AS Replies,
isnull(isnull(CAST(ISNULL((select max(date) from forum_post
where ParentPostId = p.PostId), p.Date) as varchar), ''),'Finns inga poster i denna kategori') AS LastPost
FROM forum_Category AS c
LEFT OUTER JOIN forum_Post AS p
ON p.CategoryId = c.CategoryId
WHERE c.ParentCategoryId = @CategoryId
ORDER BY CategoryId ASC

Jag vill få ut varje kategori en gång. Nu får jag ut kategorin för varje inlägg som finns. Hur löser man detta?

Tacksam för all hjälp :stud

Medlem sedan dec. 20025 483 inlägg
#2

Distinct fungerar inte på det sättet. Distinct appliceras på hela SELECT-listan. Så det du måste fråga dig är följande: av två eller flera rader med samma kategori, vilken av dem vill jag visa?

Medlem sedan sep. 2005833 inlägg
#3

Det kvittar vilken av kattegorierna som visas då de har samma id och namn. Det är kategorierna som e själva "huvud" delen i frågan. Det är dem jag vill ha information om.

Medlem sedan dec. 200012 464 inlägg
#4

Varför har du med denna om du bara vill visa kategoriinnehåll?

isnull(p.PostId, 0) AS PostId,
Medlem sedan sep. 2005833 inlägg
#5

det är för att jag ska kunna få ut id:t till den senaste uppdaterade inlägget.

Som jag har den nu får jag ut följande:

CategoryId  Name                                               PostId      Topics      Replies     LastPost                       
----------- -------------------------------------------------- ----------- ----------- ----------- ------------------------------ 
3           Test                                             1           2           1           Apr 20 2008  9:56PM            
3           Test                                             3           2           1           Apr 20 2008  9:56PM            
3           Test                                             4           2           1           Apr 20 2008  9:24PM
Medlem sedan dec. 200012 464 inlägg
#6
SELECT c.CategoryId, 
       c.Name, 
       coalesce(max(postid),0) as PostId,
       sum(case when parentPostid = 0 then 1 else 0 end) as topics,
       sum(case when ParentPostId <> 0 then 1 else 0 end) AS replies,
       coalesce(cast(max(p.date) as varchar(20)),'Finns inga poster i denna kategori') AS LastPost
  FROM forum_Category AS c
  LEFT OUTER JOIN forum_Post AS p
    ON p.CategoryId = c.CategoryId
 WHERE c.ParentCategoryId = @CategoryId
 group by c.CategoryId, 
       c.Name

Jag tog bort din order by då categoryid alltid har samma värde.

Medlem sedan sep. 2005833 inlägg
#7

kanon, fungerar perfa.

En liten sak bara, kan man när p.date inte är null och det innehåller samma datum som dagens skriva ut "idag kl: 20:37" och för gårdagens "igår kl: 20:37". Äldre skrivs ut med datumet Mån 21 apr, 2008 20:37???

Tacksam för all hjälp :stud

Medlem sedan dec. 200012 464 inlägg
#8
case when max(p.date) is not null then
              case when datediff(dd,getdate(),max(p.date)) = 0 then 
   'idag kl:' + substring(convert(varchar(20),max(p.date),8),1,5)
        else cast(max(p.date) as varchar(20)) end 
  else 'Det finns inga poster' end

ungefär

257 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)