Avatar billede safl Nybegynder
21. marts 2005 - 12:42 Der er 26 kommentarer og
1 løsning

Hjælp til query

Hello!

Til et meget simpelt forum har jeg brug der for en sql-query der returnere følgende sæt:

SUBJECT, USERS.FULLNAME, DATO for nyeste SVAR, ANTAL SVAR PÅ TRÅDEN.

Tabellen (forum) ser således ud:
id, parent_id, date, user_id, subject, content

Og har tilknyttet en bruger tabel (users) der ser således ud:
user_id, passwd, fullname

Men er mildest talt lost. Håber i kan hjælpe!

-Simon
Avatar billede bromer Nybegynder
21. marts 2005 - 12:46 #1
Jeg tror ikke du kan løse det med een query. Hvilket scriptsprog bruger du foran for så kan jeg lige hurtigt kode noget der finder de informationer til dig.
Avatar billede barklund Nybegynder
21. marts 2005 - 12:48 #2
SELECT f.id, f.subject, u.fullname, MAX(c.date) AS date, COUNT(1) AS svar
FROM forum AS f INNER JOIN users AS u ON f.user_id = u.user_id
LEFT JOIN forum AS c ON f.id = c.parent_id
ORDER BY flaf

Må det vist være :)
Avatar billede safl Nybegynder
21. marts 2005 - 12:48 #3
Bruger PHP men det skal fungere som en query jeg kan sagtens selv lave det som flere forskellige query's. Men det må da kunne lade sige gøre med noget subquery magic og lidt GROUP BY eller noget i den dur?
Avatar billede barklund Nybegynder
21. marts 2005 - 12:49 #4
Den er dog kun i et niveau - hvis du har et komplet "trådet" forum, så kan den ikke. Men hvis du bare har "hovedindlæg" og til disse "underindlæg", så kan man som ovenstående.
Avatar billede barklund Nybegynder
21. marts 2005 - 12:49 #5
SELECT f.id, f.subject, u.fullname, MAX(c.date) AS date, COUNT(1) AS svar
FROM forum AS f INNER JOIN users AS u ON f.user_id = u.user_id
LEFT JOIN forum AS c ON f.id = c.parent_id
GROUP BY f.id
ORDER BY flaf

Manglede lige ;)
Avatar billede bromer Nybegynder
21. marts 2005 - 12:49 #6
fair nok. Barklunds løsning virker fint hvis der er eet niveau. Jeg havde en træstruktur i hovedet.
Avatar billede safl Nybegynder
21. marts 2005 - 12:50 #7
order by flaf?
Avatar billede bromer Nybegynder
21. marts 2005 - 12:50 #8
erstat flaf med hvad du vil have
Avatar billede bromer Nybegynder
21. marts 2005 - 12:51 #9
altså hvad du vil sortere efter :)
Avatar billede barklund Nybegynder
21. marts 2005 - 12:51 #10
Muligvis f.date DESC kunne jeg forestille mig :)
Avatar billede safl Nybegynder
21. marts 2005 - 12:56 #11
Hmm et problem den kommer med alle svar men jeg skal kun have "top-level".
Avatar billede bromer Nybegynder
21. marts 2005 - 12:57 #12
smid WHERE f.parent = 0 på
Avatar billede bromer Nybegynder
21. marts 2005 - 12:57 #13
hvis parent er 0 når det er toplevel svar
Avatar billede barklund Nybegynder
21. marts 2005 - 12:58 #14
"WHERE f.parent_id = 0"

Eller hvad dine tomme id'er nu refererer til.
Avatar billede bromer Nybegynder
21. marts 2005 - 12:59 #15
nåja.. jeg skrev lidt forkert.. men meningen var der
Avatar billede safl Nybegynder
21. marts 2005 - 13:01 #16
Query'en ser nu sådan ud:

SELECT f.id, f.subject, u.fullname, MAX( c.date ) AS date, COUNT( 1 ) AS svar
FROM forum AS f
INNER JOIN users AS u ON f.user_id = u.user_id
LEFT JOIN forum AS c ON f.id = c.parent_id
WHERE f.parent_id =0
GROUP BY f.id
ORDER BY f.date

Men af en eller anden grund så får den ikke altid korrekt dato ud? Det syntes jeg er rimelig underligt.
Avatar billede barklund Nybegynder
21. marts 2005 - 13:04 #17
Hvordan ikke korrekt dato? Forklar :)
Avatar billede safl Nybegynder
21. marts 2005 - 13:05 #18
Hmm det skrev når der ingen "childs" er til en parent. Så kommer datoen op som NULL.
Avatar billede safl Nybegynder
21. marts 2005 - 13:05 #19
skrev = sker
Avatar billede barklund Nybegynder
21. marts 2005 - 13:08 #20
Ja, selvfølgelig - så er der ingen max_date - men prøv:

SELECT f.id, f.subject, u.fullname, IFNULL(MAX( c.date ), f.date) AS date, COUNT( 1 ) AS svar
FROM forum AS f
INNER JOIN users AS u ON f.user_id = u.user_id
LEFT JOIN forum AS c ON f.id = c.parent_id
WHERE f.parent_id =0
GROUP BY f.id
ORDER BY f.date

Og se, om ikke det giver noget spændende :)
Avatar billede safl Nybegynder
21. marts 2005 - 13:11 #21
Det bliver bedre og bedre :)
Men antallet af svar er dog ikke korrekt. For både når der er ET svar returnerer den 1 OG når der er NUL svar returnerer den 1.
Avatar billede barklund Nybegynder
21. marts 2005 - 13:12 #22
IF(c.id IS NULL, 0, COUNT( 1 )) AS svar
Avatar billede barklund Nybegynder
21. marts 2005 - 13:12 #23
prøver vi så ;)
Avatar billede safl Nybegynder
21. marts 2005 - 13:17 #24
Så vi ender på:

SELECT f.id, f.subject, u.fullname, IFNULL(MAX( c.date ), f.date) AS date, IF(c.id IS NULL, 0, COUNT( 1 )) AS answer
FROM forum AS f
INNER JOIN users AS u ON f.user_id = u.user_id
LEFT JOIN forum AS c ON f.id = c.parent_id
WHERE f.parent_id =0
GROUP BY f.id
ORDER BY f.date

Det virker :) Mange tak for hjælpen! Opret lige et svar barklund så du kan få nogle point!
Btw hvordan har du lært at strikke sql sammen? Jeg legede meget med det for 2 år siden men er monster rusten lige nu så et par gode råd ville være lækkert!
Avatar billede barklund Nybegynder
21. marts 2005 - 13:22 #25
Tja, ved at bruge det - primært :)
Avatar billede safl Nybegynder
21. marts 2005 - 13:29 #26
Hehe udemærket, endnu en gang tak for hjælpen og fortsat god dag.
Avatar billede barklund Nybegynder
21. marts 2005 - 13:30 #27
Tark for points - og i lige måde :D
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