webForumDet fria alternativet

problem med distinct

7 svar · 654 visningar · startad av Vinnaren

VinnarenMedlem sedan sep. 2005858 inlägg
#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

Peter SMedlem sedan dec. 20025 484 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?

VinnarenMedlem sedan sep. 2005858 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.

LarsGMedlem sedan dec. 200012 465 inlägg
#4

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

isnull(p.PostId, 0) AS PostId,
VinnarenMedlem sedan sep. 2005858 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
LarsGMedlem sedan dec. 200012 465 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.

VinnarenMedlem sedan sep. 2005858 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

LarsGMedlem sedan dec. 200012 465 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

Genererad på 382 ms · cache AV · v20260730165559-full.f96bc7eb