14. december 2004 - 20:59Der 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:
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;
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;
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;
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å.
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.