24. oktober 2011 - 17:22Der 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.
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:
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:
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.
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:
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?
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.
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.
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?
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.
...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.
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.
Synes godt om
Ny brugerNybegynder
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.