Avatar billede cjep Nybegynder
14. december 2004 - 20:59 Der er 4 kommentarer og
1 løsning

SQL i 3+1 tabeller

Hej SQL-brainies..

Jeg søger hjælp til en SQL sætning, der virker lidt rigeligt avanceret for mig. Jeg er ved at lave et
forum ved brug af et datagrid i Asp.Net og datasourcen er et SQL-udtræk.

Forum består af 3 tables + 1 User table, der ser således ud:

ForumFirstLevel
---------------------------------------------
ForumID            Text
ForumName        Text
ForumDescription    Text
ForumModeratorUserID    Text
FourmSIG        Text
ForumDateTime        Text

(ForumFirstLevel.ForumID relaterer til ForumSecondLevel.ForumID)

ForumSecondLevel
---------------------------------------------
ForumID            Text
ThreadID        Text
ThreadName        Text
ThreadOwnerID        Text
ThreadDateTime        Text

(ForumSecondLevel.ThreadID relaterer til ForumThirdLevel.TreadID)

ForumThirdLevel
---------------------------------------------
ThreadID        Text
TopicID            Text
TopicTitle        Text
TopicText        Memo
TopicAuthorID        Text
TopicDateTime        Text


Users
----------------------------------------------
UserID            Text
UserName        Text




Jeg ønsker at lave 3 forskellige views og de er især de 2 første, jeg har lidt udfordringer med:

Fora-liste
----------
ForumName, No-of-Threads-in-forum, No-of-Topics-in-all-threads-in-forum, UserName-last-topic, Date-last-topic
...
...
...


Thread-liste (on selected ForumId)
------------
ThreadName, ThreadOwnerID, No-of-Topics-in-thread, UserName-last-topic, Date-last-topic
...
...
...


Indtil nu er det lykkedes mig at få lavet Fora-listen med No-of-threads-in-forum og få lavet Thread-listen
med No-of-topics-in-thread jf. nedenstående SQL-sætninger. Det var svært at nå dertil med mit SQL kendskab. Tredie level er ikke noget problem, da alt jeg skal bruge ligger i ForumThirdLevel og Users.

Kan nogen knække nøden (kører mod Access i Asp.net)?
I må meget gerne arbejde med DateTime datatype i Databasen, jeg kender ikke syntax i SQL til det, så hjælp
der er også velkommen.

SELECT ForumFirstLevel.ForumID,ForumFirstLevel.ForumName,ForumFirstLevel.ForumDescription,ForumFirstLevel.ForumModeratorUserID,ForumFirstLevel.ForumSIG,ForumFirstLevel.ForumDateTime, count(*) as Entries FROM ForumFirstLevel, ForumSecondLevel WHERE ((ForumFirstLevel.ForumID=ForumSecondLevel.ForumID)) group by ForumFirstLevel.ForumID, ForumFirstLevel.ForumName,ForumFirstLevel.ForumDescription,ForumFirstLevel.ForumModeratorUserID,ForumFirstLevel.ForumSIG,ForumFirstLevel.ForumDateTime ORDER BY ForumFirstLevel.ForumID;

SELECT ForumSecondLevel.ThreadID, ForumSecondLevel.ThreadName, ForumSecondLevel.ThreadOwnerID, ForumSecondLevel.ThreadDateTime, count(1) as Entries FROM ForumSecondLevel, ForumThirdLevel WHERE ((ForumSecondLevel.ThreadID=ForumThirdLevel.ThreadID) and (ForumSecondLevel.ForumID ='" & ForumID & "')) group by ForumSecondLevel.ThreadID, ForumSecondLevel.ThreadName, ForumSecondLevel.ThreadOwnerID, ForumSecondLevel.ThreadDateTime ORDER BY ForumSecondLevel.ThreadID;

Mvh
CJEP
Avatar billede kjulius Novice
23. december 2004 - 01:43 #1
Da Access ikke understøtter COUNT(DISTINCT feltnavn) funktionen, er du vist nødt til at lave mere end ét VIEW (forespørgsel) din Access database, for at kunne få din fore-liste til at fungere.

Lav en simpel forespørgsel i databasen, som lyder som følger:

SELECT ForumID, COUNT(*) AS Theads FROM ForumSecondLevel;

(I det efterfølgende refereret til som forespørgslen 'Tråde')

Det er en forespørgsel hvis eneste formål er at holde rede på hvor mange tråde der er pr. forum. Den kan du så bygge videre på, når du laver foralisten:

SELECT L1.ForumID, L1.ForumName, L1.ForumDescription, L1.ForumModeratorUserID, L1.ForumSIG, L1.ForumDateTime, T1.Threads, count(*) as Entries, LAST(U1.UserName), LAST(L2.TopicDateTime)
FROM ForumFirstLevel AS L1
INNER JOIN ForumSecondLevel AS L2
  ON L1.ForumID = L2.ForumID
INNER JOIN Tråde AS T1
  ON L1.ForumID = T1.ForumID
INNER JOIN Users AS U1
  ON L2.TopicAuthorID = U1.UserID
GROUP BY L1.ForumID, L1.ForumName, L1.ForumDescription, L1.ForumModeratorUserID, L1.ForumSIG, L1.ForumDateTime, T1.Threads
ORDER BY L1.ForumID;

På samme måde med thread listen:

SELECT L2.ThreadID, L2.ThreadName, L2.ThreadOwnerID, L2.ThreadDateTime, COUNT(*) AS Entries, LAST(U1.UserName) AS LastTopicUserName, LAST(L3.TopicDateTime) AS LastTopicDateTime
FROM ForumSecondLevel AS L2
INNER JOIN ForumThirdLevel AS L3
  ON L2.ThreadID = L3.ThreadID
INNER JOIN Users AS U1
  ON L3.TopicAuthorID = U1.UserID
GROUP BY L2.ThreadID, L2.ThreadName, L2.ThreadOwnerID, L2.ThreadDateTime
ORDER BY L2.ThreadID;

I teorien burde det virke... :-)
Avatar billede kjulius Novice
23. december 2004 - 01:50 #2
Da Access ikke understøtter COUNT(DISTINCT feltnavn) funktionen, er du vist nødt til at lave mere end ét VIEW (forespørgsel) din Access database, for at kunne få din fore-liste til at fungere.

Lav en simpel forespørgsel i databasen, som lyder som følger:

SELECT ForumID, COUNT(*) AS Theads
FROM ForumSecondLevel
GROUP BY ForumID;

(I det efterfølgende refereret til som forespørgslen 'Tråde')

Det er en forespørgsel hvis eneste formål er at holde rede på hvor mange tråde der er pr. forum. Den kan du så bygge videre på, når du laver foralisten:

SELECT L1.ForumID, L1.ForumName, L1.ForumDescription, L1.ForumModeratorUserID, L1.ForumSIG, L1.ForumDateTime, T1.Threads, count(*) as Entries, LAST(U1.UserName), LAST(L2.TopicDateTime)
FROM ForumFirstLevel AS L1
INNER JOIN ForumSecondLevel AS L2
  ON L1.ForumID = L2.ForumID
INNER JOIN Tråde AS T1
  ON L1.ForumID = T1.ForumID
INNER JOIN Users AS U1
  ON L2.TopicAuthorID = U1.UserID
GROUP BY L1.ForumID, L1.ForumName, L1.ForumDescription, L1.ForumModeratorUserID, L1.ForumSIG, L1.ForumDateTime, T1.Threads
ORDER BY L1.ForumID;

På samme måde med thread listen:

SELECT L2.ThreadID, L2.ThreadName, L2.ThreadOwnerID, L2.ThreadDateTime, COUNT(*) AS Entries, LAST(U1.UserName) AS LastTopicUserName, LAST(L3.TopicDateTime) AS LastTopicDateTime
FROM ForumSecondLevel AS L2
INNER JOIN ForumThirdLevel AS L3
  ON L2.ThreadID = L3.ThreadID
INNER JOIN Users AS U1
  ON L3.TopicAuthorID = U1.UserID
GROUP BY L2.ThreadID, L2.ThreadName, L2.ThreadOwnerID, L2.ThreadDateTime
ORDER BY L2.ThreadID;

I teorien burde det virke... :-)
Avatar billede cjep Nybegynder
11. januar 2005 - 22:17 #3
Det var også den løsning jeg selv var kommet frem til; men dermed skal jeg ud i to datagrids.
Du kan få 100 points for indsatsen, for opgaven er jo ikke løst.. lægger lige et spgs til dig, du kan svare på.
Avatar billede cjep Nybegynder
11. januar 2005 - 22:20 #4
Kjulius, du kan hente dine point i #579760
Avatar billede cjep Nybegynder
11. januar 2005 - 22:21 #5
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester