Avatar billede markus-king Nybegynder
24. oktober 2011 - 17:22 Der er 10 kommentarer og
1 løsning

Sortér tråd efter indlæg

Hey,

Jeg har et forum med 2 tabeller: "forum" og "forum_svar".

"Forum" er til at gemme trådene i, hvorimod "forum_svar" er til indlægene i trådene.

Mit spørgsmål er så, om hvordan man sortérer trådoversigten efter seneste indlæg, hvor tråden skal ligge øverst alt efter hvornår sidste indlæg er skrevet.

Det er nemlig ikke bare med en ORDER BY.

Databasen er MySQL og scriptet er skrevet i PHP.
24. oktober 2011 - 18:13 #1
Du kommer til at fortælle lidt mere - jeg er så dårlig til at gætte.  Hvordan ved du hvor gammel en tråd er?  Har tabellen forum_svar et felt med afsendelsestidspunktet?  Med dataformat DATETIME?

Og vil du have alle tråde vist med alle indlæg, således at for den tråd der har det seneste indlæg vises alle indlæg efter alder, nyeste først, derefter vises alle indlæg for den tråd der har det seneste indlæg bortset fra dem der allerede er vist, og så videre, og til sidst de tråde der ingen indlæg har?  Altså:

Lad os sige du har tre tråde med emnerne 'Emne1', 'Emne2, og 'Emne3.  Der er kommet fem indlæg i denne rækkefølge fra ældst til nyest:

emne indlæg tid
Emne2 indlæg1 2011-10-22 12:00:00
Emne2 indlæg2 2011-10-22 17:18:19
Emne1 indlæg3 2011-10-23 08:00:05
Emne1 indlæg4 2011-10-23 09:10:11
Emne2 indlæg5 2011-10-24 13:14:15

så er den tråd der har det seneste indlæg Emne2.  Emne3 har slet ingen indlæg.  Vil du så have alle tråde vist, hver tråd med alle indlæg fra nyest til ældst, og den tråd der har det nyeste indlæg først?  Altså således:

Emne2 indlæg5 2011-10-24 13:14:15
Emne2 indlæg2 2011-10-22 17:18:19
Emne2 indlæg1 2011-10-22 12:00:00
Emne1 indlæg4 2011-10-23 09:10:11
Emne1 indlæg3 2011-10-23 08:00:05
Emne3

Er det rigtigt forstået?
Avatar billede markus-king Nybegynder
24. oktober 2011 - 20:15 #2
Tak for svar.

Ja, nogenlunde.

Forum_svar indeholder IDet på Forum. Trådene har altså et ID nummer hver, som indlæggene er knyttet til alt efter hvilken tråd man skriver i.

Der er så en trådoversigt, kun med trådtitle, forfatter, dato og antal indlæg. Herfra kan man klikke sig ind på tråden og læse dennes indlæg.

Det er trådoversigten jeg vil have sorteret, hvor den tråd med nyeste indlæg ligger øverst.

Dataformatten er dog sat til varchar af en eller anden grund..? Det er et gammelt system fra mine tidligere år med PHP. Problemet er blot, at der er formange indlæg til at kunne redigere i dem alle.
24. oktober 2011 - 20:50 #3
Så det er kun trådene du vil have?  Hvis du, for eksempel, har tre tråde med titlerne emne1, emne2, og emne3, og emne1 har fået fem indlæg hvoraf det sidste 23 oktober 2011 klokken 1800 emne2 har fået 8 indlæg hvoraf det sidste 24 oktober 2011 klokken 1200 og emne3 har aldrig fået et indlæg, så vil du, i princippet, have udskrevet dette:

titel forfatter antal_indlæg
emne2 forfatter2 8
emne1 forfatter1 5
emne3 forfatter3 0

Fik jeg fat på den dennegang?

Og så har du dato og tid i tekststrenge.  Er de tekststrenge holdt i et bestemt format så du kan søge og sortere på det?  Prøv at give nogle eksempler på  Hvordan søger du og sorterer du på det?  Kan du give nogle eksempler på dato/tider gemt i tabellen?
Avatar billede markus-king Nybegynder
24. oktober 2011 - 21:12 #4
Jep, du ramte plet ;)

Alle datoer er i formatet d/m-y G:i

Lige p.t. er trådoversigten sorteret efter seneste tråd. Det vil sige, at den nyeste tråd altid ligger øverst, uafhængig af nyeste indlæg.
24. oktober 2011 - 21:45 #5
Det vil du ikke være med til, at giv enogle eksempler på bevaret dato/tid og fortælle, hvordan du søger på og sorterer på dato-tid tekststrengen som jeg bad om?  (For eksempel ville det have været nyttigt, nu du siger, at trådorversigten nu er sorteret efter nyeste tråd, at vise den query du bruger til at hente trådene og sortere dem efter nyhed.)  Jamen du bestemmer naturligvis, hvad jeg skal se og have at vide, men i så fald må jeg nok bakke ud.  Så må vi håbe der kommer en anden der fra de givne oplysninger kan hjælpe.
Avatar billede markus-king Nybegynder
24. oktober 2011 - 22:44 #6
Problemet er, at der ikke sorteres efter tid, men ID på tråden. Min fejl, det burde jeg havde nævnt.

Den højeste ID af trådene er nemlig den der står øverst og dermed også den nyeste.

Den eneste løsning jeg umiddelbart kan overskue er at ændre VARCHAR til DATETIME. På den måde kan jeg sortere efter dato istedet for. Men det er desværre ikke muligt med de store mængder indlæg og tråde, der nu engang er.
25. oktober 2011 - 06:25 #7
Måske var der fejl fra begge sider.  Det jeg ville have spurgt var hvordan du ved hvilke INDLÆG der er de nyeste.  Jeg går nu ud fra, at også indlæggene får en løbende id således at indlæg med højeste id er det nyeste.  I såfald kan opgaven omskrives til at sortere trådoversigten efter det højeste id af de indlæg der ligger i trådene.

For at teste mine ideer lavede jeg en mini-database med to tabeller:

markus_forum
id titel

markus_forum_svar
id foruumid indhold

Så lavede jeg først en query for at gruppere indlæggene efter tråde og for hver tråd finde højeste indlæg id og antal indlæg:

SELECT MAX(id) svar, count(ID) antal, forumid FROM markus_forum_svar GROUP BY forumid

Den brugte jeg så som sub-query således:

SELECT id, titel, sv.svar, sv.antal FROM markus_forum fo LEFT JOIN (SELECT MAX(id) svar, count(ID) antal, forumid FROM markus_forum_svar GROUP BY forumid) sv ON fo.id = sv.forumid ORDER BY svar DESC;

Og det gav mig dette resultat, der svarer til de data jeg indsatte i tabellerne:
 
id  titel  svar  antal 
2    titel2  10  4
1    titel1    8  4
4    titel4    6  2
3    titel3 NULL NULL

Din forum tabel har flere oplysninger, såsom forfatter og dato.  Ved du selv, hvordan du tilpasser min foreslåede query til at tage disse med og hvordan du skriver php kode til at fange disse data fra mysql og præsentere dem på siden?
Avatar billede markus-king Nybegynder
25. oktober 2011 - 17:59 #8
Hej igen,

Først tak for hjælpen, det er værdsat.

Nu bliver jeg nok til at spørge for at få det hele på plads. Hvordan fungerer LEFT JOIN med hentydning til sv ON fo?

Desuden vil det nok være bedre hvis du kunne se få et bedre overblik over min database:

"forum" indeholder:
id overskrift sporgsmal dato ip

forum_svar indeholder:
id navn svar dato nr ip

Der er altså intet antal, og "nr" er blot forum's id.
25. oktober 2011 - 19:25 #9
Med hensyn til JOIN, så består der OUTER JOIN og INNER JOIN.  Lad os sige du har en tabel med tråde og en tråd med indlæg således:

tråde
id navn
1  tråd1
2  tråd2
3  tråd3

indlæg
id tråd tekst
1  1    tekst1
2  1    tekst2
3  3    tekst3

Tråd1 har således to indlæg, tråd2 har ingen indlæg, og tråd3 har 1 indlæg.

Med denne query:

SELECT * FROM tråd INNER JOIN indlæg ON tråd.id = indlæg.tråd

vil give dette resultat:

1 tråd1 1 1 tekst1
1 tråd1 2 1 tekst2
3 tråd3 3 3 tekst3

Fordi tråd2 ingen indlæg har kommer den ikke med i resultatet.

Derimod denne query:

SELECT * FROM tråd LEFT OUTER JOIN indlæg ON tråd.id = indlæg.tråd

giver dette resultat:

1 tråd1 1 1 tekst1
1 tråd1 2 1 tekst2
2 tråd2 - - -
3 tråd3 3 3 tekst3

INNER JOIN tager kun det med der findes i begge tabeller, LEFT OUTER JOIN tager alt med fra den venstre tabel plus det der matcher fra den højre tabel, og RIGHT OUTER JOIN tager alt med fra den højre tabel og det der matcher fra den venstre tabel.

de fleste SQL systemer, deriblandt mysql, er indrettet således at JOIN betyder INNER JOIN, LEFT JOIN betyder LEFT OUTER JOIN, og RIGHT JOIN betyder RIGHT OUTER JOIN.

Fordi jeg regnede med, at din trådoversigt skulle inbefatte alle tråde, også de der endnu ingen indlæg havde, foreslog jeg at bruge LEFT JOIN i stedet for bare JOIN.
25. oktober 2011 - 19:41 #10
...med hensyn til antal, så sagde du i #2, at du for hver tråd skulle bruge antal indlæg.  Ikke sandt?  Så jeg fik min foreslåede query til at tælle antal indlæg per tråd således:

SELECT MAX(id) svar, count(ID) antal, forumid FROM markus_forum_svar GROUP BY forumid
 
Du var desværre meget sparsom med oplysninger i dit oprindelige spørgsmål.  Jeg har måttet fiske det ud af dig og gætte mig frem.  Nu må du så selv tilpasse min foreslåede query til dine virkelige tabeller, for eksempel i stedet for SELECT id, titel ... FROM markus_forum skal du formentlig bruge SELECT id, overskrift, spørgsmål, dato, ip ... FROM forum, og i stedet for LEFT JOIN .... ON fo.id = sv.forumid bliver det LEFT JOIN .... ON fo.id = sv.nr 

o.s.v.

Meningen med Eksperten er at give hjælp til selvhjælp.  Jeg kommer til at stoppe her af tidshensyn.  Jeg mener at have givet dig hjælp til selv at kunne slutte af, blandt andet ved at indsætte de oplysninger du først kom med i indlæg # 8.  Hvis du mener som jeg, at jeg har ydet hjælp, så accepter venligst mit svar #7.  Hvis du ikke mener, at jeg har hjulpet (eller ikke hjulpet nok), så opret selv et svar og accepter det, så tråden kan blive afsluttet.
Avatar billede markus-king Nybegynder
25. oktober 2011 - 20:12 #11
Jeg har i den grad fået den hjælp jeg skulle bruge - tak!

Jeg vil se om jeg kan få det til at fungere, ellers ved jeg hvor jeg kan spørge. Har under alle omstændigheder tænkt mig at sætte mig mere ind i JOIN, så må vi se hvor det fører hen.

Tak for du gav dig tid, skønt at der er nogle som dig til at hjælpe.

Jeg har accepteret dit svar. Endnu engang tak.
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
Kurser inden for grundlæggende programmering

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