10. oktober 2003 - 16:31Der er
42 kommentarer og 1 løsning
php/ mysql: udtræk
Jeg er ved at lave en forumoversigt, der viser de 20 nyeste unikke emner, dvs ikke 2 ens indlæg i oversigten.
Forumtabellen indeholder flg kolonner: id - emne - indhold
Meningen er, at jeg vil lave et udtræk, der: - grupperer emnerne, således at det EMNE med det nyeste INDLÆG kommer først, det EMNE med det næstnyeste INDLÆG kommer derefter (hvis ellers emnet er forskelligt fra første emne)... etc etc - have muligheden for at vise ældre / nyere emner (LIMIT på fx 20 emner)
Jeg er gået i stå, fordi jeg ikke kan se, hvordan jeg kan lave et sådant udtræk. Er der en venlig ekspert, der vil hjælpe med at lave et økonomisk rigtigt udtræk, der kan ovenstående?
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Hvis du ved hvilke andre felter du gerne vil trække ud er det let nok.. Så er det bare noget lignende:
SELECT MAX( id ) , felt, felt2 FROM forum GROUP BY emne ORDER BY id DESC
Så er det bare at sætte kolonnernes navne ind i SQL-forspørgelsen også.. Men så går dit nummer med * desværre ikke.. Der er vel heller ingen rigtig grund til at du gør det sådan eller?!
Hvordan definerer du "det første" ?!? Er det når id'et er så lille som muligt? Eller har du en specifik defination i en anden kolonne evt? Hvis det er som jeg tror det er, hvor id'et er det eneste der definerer hvilke poster der er spørgsmålet og hvilke der blot er kommentarer, skal vi ud i noget JOIN imellem samme tabel.. Altså noget hen i retningen af:
SELECT MAX( a.id ) AS sortby, b.felt2 AS question, a.felt, a.felt2 FROM forum a LEFT JOIN forum b ON b.answer = a.answer GROUP BY a.emne ORDER BY b.id ASC , sortby DESC
Hvis du er ligegald med hvad det er der sker gider jeg heller ikke beskrive den.. Men sig endelig til hvis det ikke står således til ;D (gider bare ikke sidde og skrive en flere-siders roman hvis du alligevel ikke læser det :)
prøv den jeg har postet længere oppe.. ;D Skulle gerne tage den første post ved udtræk på tabel b, som opfylder din ON-statement.. Altså at emnet er lig hinanden..
Der er dog for lige at tjekke om du var vågen sneget sig en fejl ind.. ;D
Der skulle nok havde stået noget lignende LEFT JOIN forum b ON b.emne = a.emne i stedet for LEFT JOIN forum b ON b.answer = a.answer
Sådan går det når man ikke tester sine sql-kommandoer før de bliver skrevet herind.. :D
men som morten også allerede har påpeget er det en YDERST uproffesionel måde du har struktureret din database på.. Det ville gøre det langt lettere at have spørgsmålene i en tabel, og svarene i en anden.. Altså så du blot skulle hente dine data ud ved hjælp af et par JOINs.. Det du har gang i nu KAN lade sig gøre, og det det da vel også fint ;), men i forhold til server-krafter og vansklige scripts er det ikke meget der skal laves om.. Hvad vil du gøre næste gang du finder ud af du vil hente nogle andre data?
Du laver bare et par små-scripts, der lægger alle data over i et par tabeller, der er tænkt lidt mere over. Som nicklasb påpeger, befinder du dig kun på første trin af en lang stige, hvor hvert trin er en hovsa-løsning. Det er ikke det fede grundlag for en web-applikation :)
hehe.. Ja.. måske nummer 2 .. (ud af en milliard million ;) Ej, opgaven er jo heller ikke værre end den kan løses. Vil gætte på at den kan løses langt lettere end hele tiden at skulle lave nye hovsaløsninger som olebole så fint navngiver dem .. ;D
Men ligger lige et svar, til hvis du syntes mit svar var tilfredsstillende..
På den anden side, skal man jo som regel gøre sine egne erfaringer - og har man én gang brændt røven, gør man det nødigt igen. De fleste af os har nok siddet med en eller anden applikation, vi mange gange har ønsket os, vi havde skrevet på en anden måde fra start af ... denne kan blive din store chance for at lære det. Så kan jeg vist heller ikke være mere positiv ;o)) /mvh
Til nicklasb 10/10-2003 17:49:40 >> Når id = emne er det et spørgsmål Når id != emne er det defineret som et svar.
Jeg ville egentlig bare gerne have, at de værdier, jeg trækker ud her: SELECT MAX(id) AS sortby, felt1, felt2 FROM forum GROUP BY emne ORDER BY sortby DESC er de nyeste værdier i et emne.
Og det du skriver over forstår jeg ikke lige.. Hvad mener du med id = emne.. Hvis den er det kan der jo automatisk ikke være noget emne på dine spørgsmål eller hva?
Enten skal du beskrive det helt ned i detalje.. Eller gøre som vi indirekte (men nok forgæves ;) har prøve at få dig til; At kode det lidt om.. :D
feltet emne genereres efter at indlægget er postet.
når jeg bruger (http://www.surfersinfo.dk/test.php): $result = mysql_query("SELECT MAX(id) AS sortby, emne, dato, overskrift FROM forum_indlaeg GROUP BY emne ORDER BY sortby DESC LIMIT 10"); finder den det ældste indlægs informationer - sammenlign evt med forumoversigten i venstre side.
Jeg kunne saktens sidde og rette videre på den sql-forspøgelse.. Men igen; Det bliver ved bare at være lap på lap.. Ydelsen og resultatet er allede langt uder det det burde være på nuværende tidspunkt.. Jeg kan ikke lige se nogen fejl ved den jeg har postet op over, så hvis det virkelig er det resultat du får ud fra det jeg har postet til sidst, må det være en versionsbug eller lignende.. og gider sådan set heller ikke sidde og rette mere på den.. Så enten kan du lave det om, vente på en anden gider, eller vente til jeg får taget mig sammen..
Ville det ikke være sjovere om vi hjalp dig med at få dine gamle data over i en ny struktur ? Tror du ville få MEGET mere ud af det på lang sigt.. Men selvfølgelig dit eget valg..
Og for at kommentere din sql.. Efter hvad jeg lige har af erfaring på området kan det ikke lade sig gøre.. Først vælger du den max'e værdi ud fra et array af resultatet, herefter vælger du igen det max'e ud fra dette ene resultat?!? Eller hvad er det du prøver? Hvis du bare vil have det samme data i både sortby og id giver det ingen mening.. Brug dog hellere den samme variabel flere gange i dit script.. Eller hvad er det du vil?
En anden ting, man altid bør tænke på i forhold til ens egne scripts, er de andre på serveren. Ligger man under et web-hotel, er det ens forbandede pligt at sørge for så god performance, som overhovedet muligt. Ellers er man en pest for de andre sites på serveren. Én ting er, ens eget site kører dårligt - men man 'stjæler' RAM og CPU-kraft fra de andre, der bruger samme server/MySQL-server, hvis ikke ens site er ordentlig optimeret. Det er jo ikke særlig pænt at gøre :) Ligger du på din egen server, er det naturligvis en anden sag. Så er det kun brugerne, du irriterer - og kun fordi du ikke gider kode om. De stakler er dog altid 'ofre' ... uanset hvor dit site ligger. /mvh
det kommer jo meget an på hvad dit forum skal have af informationer..
Men en god struktur kunne være:
question_tabel id autonummerering tilfoejtid tid for hvornår spørgsmålet er tilføjet.. (*1) status Lad den være en lille tal.. En indikation af om spørgsmålet evt er slettet (*2) kategori Int; Fortæller hvilken kategori spørgsmålet tilhøre (*3) bruger Fortæller hvilken bruger der har tilføjet spørgsmålet.. (*4) overskrift Indeholder overskriften til spøgsmålet.. spørgsmål Indeholder selve spøgsmålet..
answer_tabel id autonummerering tilfoejtid tid for hvornår et svar er tilføjet.. gæller samme regler som for tilfoejtid i spørgsmålstabellen status Lad den være en lille tal.. En indikation af om svaret evt er slettet (*2) spoegsmål Int; Fortæller hvilket spørgsmål det enkelte svar hører til. Her gæller også regnerne i (*3) bruger Samme som ovenfor.. Altså en indikation af hvem der skriver svar Her skrives svaret.. og så evt et felt til overskift til de forskellige svar? Op til dig..
(*1) Her vil det helt klart være i top hvis du blot opgiver det i UNIX-TIMESTAMP.. Det er langt det bedste, da det er meget lettere at regne på.. Og så kan php meget lettere lige lave det om til det ønskede format (*2) Du kan evt lade feltet indeholde enten et ét-tal eller et to-tal.. Og så huske at tjekke på dette lige meget hvor du henter data ud.. Du har måske ikke brug for det nu. Men lig det hellere ind.. Det kan jo være.. ;D (*3) Alle kategorierne har du så i en anden database.. (*4) Nu ved jeg ikke om man blot skal skrive sit navn, eller om man skal være logget ind for at skrive. (ER det sidste tilfældet er det helt klart en ide bare at henvise til id'et.. Fylder meget mindre i din database.. og evt skift af navn vil følge med..
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.