webForumDet fria alternativet

Hämta ämnen och antal svar från samma tabell

Databaser & SQL

11 svar · 393 visningar · startad av m_soderlund

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

Jag har sökt här i forumet, men hittar bara folk som haft problem med sitt forum i att räkna ihop antalet svar till ett ämne, från en annan tabell.
Jag kör med en tabell, och vill räkna ihop alla svar till ett ämne när jag presenterar alla ämnen på förstasidan i forumet. Min kod som inte fungerar ser ungefär ut så här:

SELECT Id,Head,Topic,Name,Dt,(Count(Id) FROM tbl_forum WHERE Pid=Id) FROM tbl_forum WHERE Status='Topic' ORDER BY Id DESC

Jag är nog totalt fel ute, kan ingen hjälpa mig?

/r Jag använder en Access-databas.

Medlem sedan sep. 20026 425 inlägg
#2

Nu ser min SQL-kod ut så här:

Set Rs = Cn.Execute("SELECT Id,Head,Name,Dt,(SELECT Count(Pid) FROM tbl_forum WHERE Status='Answer' And Pid=Id) AS answ FROM tbl_forum WHERE Status='Topic' ORDER BY Id DESC")

Det är bara det att WHERE Status='Answer' måste vara WHERE Status='Topic' för att gå ihop med sista WHERE-instruktionen, och då fungerar det inte. :(

Medlem sedan juni 200032 967 inlägg
#3

Efter att ha mottagit Accessdatabas per e-post är det dags att såga lite här i tråden. :D

För det första gör din design av tabellen att frågan inte går att få ihop, eftersom du av någon anledning har satt Pid-fältet att vara av datatypen text. Varför då? Du kan inte joina eller jämföra ett talfält med ett textfält. Byt datatyp.

Du har också ett datumfält, Dt. Varför är det av typen text? Byt datatyp.

Ditt statusfält är av typen text och innehåller "Topic" eller "Answer". Mycket onödigt. Byt datatyp till tal, och lagra 0 eller 1 istället.

Dessutom lagrar du lösenord i tabellen. Vad har det i den här tabellen att göra? Det borde du ju endast lagra i användartabellen.

Om du byter datatyp på fältet Pid, så verkar följande fråga göra det du vill:

SELECT a.Id, a.Head, a.Topic, a.Name,a.Dt, (select count (*) from tbl_forum b where  b.Pid=a.Id ) as replies
FROM tbl_forum a WHERE a.Status='Topic' ORDER BY a.Id DESC

Mvh

Medlem sedan sep. 20026 425 inlägg
#4

Hm.. Det där med fel datatyp var ett slarvfel, men det mesta annat är avsiktligt.

- Jag använder text som datatyp för datum, för i Access kan man ex. inte välja att datumformatet ska se ut som 2003-04-13 12:31, i alla fall lyckas inte jag med det.

- Det där med Status-kolumnen: Jag tänkte testa med Topic/Answer och 0/1 för att se vilket som verkar effektivast, och har bara hunnit med Topic/Answer. Nu slapp jag testa med 0/1 (det är inte tidskrävande, men ändå..) - tack @nders!

- Jag lagrar ett lösenord för varje nytt ämne eller svar, forumet är inte ett medlemsforum utan ett där användarna skriver in sitt namn, e-post (sen lagras det i en cookie så att forumet kommer ihåg det) och lösenord för varje enskild post, så att man sedan kan redigera posten.

Jag skulle inte vilja använda två tabeller, det brukar oftast bli krångligast då. Om jag använder två tabeller för ämnen och svar så skulle SQL-koden inte vara något problem, men nu är det så att koden fortfarande inte fungerar, trots att jag modifierat din kod, @nders. Min kod ser för närvarande ut så här och genererar inga felmeddelanden, men räknar fel antal svar per ämne:

SELECT Id,Head,Topic,Name,Dt, (SELECT Count(Id) FROM tbl_forum WHERE Pid=Id AND Status=1) AS replies FROM tbl_forum WHERE Status=0 ORDER BY Id DESC

Koden fungerar fortfarande inte - jag har ett svar bundet till ett ämne, men replies får värdet 0.

Mycket tacksam för mer hjälp, och tacksam för hjälpen hittils. :)

Medlem sedan juni 200032 967 inlägg
#5

Jag har inte tid att tänka så mycket på detta just nu, men:

* Datumformat: Du ska ge fullständigt fan i hur Access lagrar datum. ;) Det är sånt du får formatera när du skriver ut värdena.

Jag återkommer senare.

mvh

Medlem sedan sep. 20026 425 inlägg
#6

@nders skrev:

Datumformat: Du ska ge fullständigt fan i hur Access lagrar datum. ;) Det är sånt du får formatera när du skriver ut värdena.

Då vet jag det nu, *designar om databasen*. Tack.

Men å andra sidan är SQL-koden inte löst.. :l

Medlem sedan juni 200032 967 inlägg
#7

Vad har du ändrat? Den selectfråga du visar nu ser ju inte alls ut som den jag gav dig (som fungerade, i alla fall när jag testade).

SELECT a.Id, a.Head, a.Topic, a.Name,a.Dt, (select count (*) from tbl_forum b where  b.Pid=a.Id ) as replies
FROM tbl_forum a WHERE a.Status=0 ORDER BY a.Id DESC

(Ändrade status till noll bara, annars min ursprungliga fråga.)

Mvh

Medlem sedan mars 20034 471 inlägg
#8

m_soderlund skrev:

...- Jag lagrar ett lösenord för varje nytt ämne eller svar, forumet är inte ett medlemsforum utan ett där användarna skriver in sitt namn, e-post (sen lagras det i en cookie så att forumet kommer ihåg det) och lösenord för varje enskild post, så att man sedan kan redigera posten.

Jag skulle inte vilja använda två tabeller, det brukar oftast bli krångligast då. Om jag använder två tabeller för ämnen och svar ...

Borde du inte få oerhört mycket dubbellagringar med din design? Om en person svarar på flera poster, är det inte troligt att han/hon använder samma användarnamn och lösenord hela tiden då? Då vore det väl i alla fall bättre att lagra den infon en gång och sedan ha en koppling mellan användarinfon och posterna. Annars måste en person som använder ditt forum och t.ex. vill byta lösenord därför att lillebror har fått tag i det, byta detta lösenord på alla poster som han/hon har skrivit! Inte särskilt praktiskt.

På samma sätt, om du har ämnen och poster i samma tabell och någon gång i framtiden vill byta namn på ett ämne, så måste du med nuvarande struktur gå igenom hela databasen och ändra, i stället för att ändra på ett ställe i ämnestabellen. Genvägar är sällan enklast i längden.

Medlem sedan sep. 20026 425 inlägg
#9

@nders skrev:

Vad har du ändrat? Den selectfråga du visar nu ser ju inte alls ut som den jag gav dig (som fungerade, i alla fall när jag testade).

SELECT a.Id, a.Head, a.Topic, a.Name,a.Dt, (select count (*) from tbl_forum b where  b.Pid=a.Id ) as replies
FROM tbl_forum a WHERE a.Status=0 ORDER BY a.Id DESC

(Ändrade status till noll bara, annars min ursprungliga fråga.)

Mvh

Uhm, utgår du inte från att jag använder två tabeller, a och b?

aasah: du har en del poänger, men poängen med detta forum är att det inte ska vara ett medlemsforum, utan ett forum som exempelvis Palleman.nu's forum.

Och sen har jag kommit runt problemet genom att lägga till ett fält i databasen, men om @nders kod nu fungerar använder jag den i stället. Tack!

Medlem sedan juni 200032 967 inlägg
#10

Nej, jag utgår inte ifrån att du har två tabeller, utan en. Dock har jag använt samma tabell två gånger i frågan (a och b). Testa.

Jag har som sagt testat mot din tabell, så det vore konstigt om det inte fungerar.

Mvh

Medlem sedan sep. 20026 425 inlägg
#11

WOW! Tack @nders, det fungerade perfekt! Nu vet jag att man kan använda sådana namn på tabeller som inte existerar, för att kunna skapa en Join i en tabell. Tack!

Status för forumutvecklandet:
Utvecklingen går framåt, lite småfunktioner börjar att ta form. Närmast ska Martin söka efter citering på wF, samt kolla om han hittar någon bra Regular Expressions-text-->länk-konverterare. :)

Medlem sedan juni 200032 967 inlägg
#12

m_soderlund skrev:

WOW! Tack @nders, det fungerade perfekt! Nu vet jag att man kan använda sådana namn på tabeller som inte existerar, för att kunna skapa en Join i en tabell. Tack!

Varsågod. :)

Egentligen använder man nyckelordet AS för att tilldela alias för en tabell eller ett fält, men det kan man lika gärna utelämna. Men, för översiktilighetens skull borde frågan sett ut så här:

SELECT a.Id, a.Head, a.Topic, a.Name,a.Dt, (select count (*) from tbl_forum [b]as[/b] b where  b.Pid=a.Id ) as replies
FROM tbl_forum [b]as[/b] a WHERE a.Status=0 ORDER BY a.Id DESC

Fältnamnen kvalificeras sedan med det nya namnet för att bestämma vilken av de två tabellinstanserna du menar.

Det var säkerligen ingen nyhet för dig, men kanske hjälper det någon om inte dig? :)

Mvh,

275 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)