Avatar billede lademan Novice
10. oktober 2003 - 16:31 Der 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?

Tak for hjælpen!
Avatar billede fangel Nybegynder
10. oktober 2003 - 16:36 #1
du kan lege med GROUP BY... denne groupere indlæg... det vil hjælpe dig lidt på vej...

Morten
Avatar billede lademan Novice
10. oktober 2003 - 16:37 #2
har leget meget med group by, men om jeg ser det løser den ikke mit problem?
Avatar billede lademan Novice
10. oktober 2003 - 16:37 #3
som
Avatar billede lademan Novice
10. oktober 2003 - 16:41 #4
mysql_query("SELECT * FROM forum GROUP BY emne");

løser ikke problemet, idet den blot skaber en oversigt over de nyeste emner - og ikke en oversigt over de emner med de nyeste indlæg i...
Avatar billede fangel Nybegynder
10. oktober 2003 - 16:44 #5
mysql_query("SELECT * FROM forum GROUP BY emne ORDER BY id DESC");

måske...

Morten
Avatar billede lademan Novice
10. oktober 2003 - 16:47 #6
den går desværre ikke :-(
Avatar billede lademan Novice
10. oktober 2003 - 16:48 #7
alle, der har lavet et forum må da have været udsat for denne problemstilling?
Avatar billede fangel Nybegynder
10. oktober 2003 - 16:48 #8
normalt laves det i 2 tabeller...! det gør det lidt nemmere (et spørgsmål om en left join)

Morten
Avatar billede lademan Novice
10. oktober 2003 - 16:53 #9
det må kunne lade sig gøre.
Avatar billede fangel Nybegynder
10. oktober 2003 - 16:54 #10
tjoo - men så skal du have en SQL-nørd - og det er ikke lige mig... (jeg prøver mig frem i phpMyAdmin til jeg får noget konstruktivt)

Morten
Avatar billede lademan Novice
10. oktober 2003 - 16:56 #11
ok, jeg søger en mysql-eksperts hjælp så :-))
Avatar billede nicklasb Nybegynder
10. oktober 2003 - 17:05 #12
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?!
Avatar billede lademan Novice
10. oktober 2003 - 17:15 #13
Det er noget af det rigtige! - men jeg kan ikke få den til at passe helt.
Avatar billede lademan Novice
10. oktober 2003 - 17:18 #14
Det er følgende der mangler:

ORDER BY MAX(id)
Avatar billede lademan Novice
10. oktober 2003 - 17:18 #15
men det godtager den ikke
Avatar billede nicklasb Nybegynder
10. oktober 2003 - 17:24 #16
hva mener du med det? Den kan da ikke sortere efter det max'ne id ud af mange, da de ikke har nogen relation til de andre udtræk.. Hvad er det du vil?

Hvis du vil sortere efter det tal MAX-id'et returnere, skal det gøres efterfølgende med en sort på en henvisning til dette tal.. altså noget hen af:

SELECT MAX( id ) AS sortby, felt, felt2 FROM forum GROUP BY emne ORDER BY sortby DESC
Avatar billede lademan Novice
10. oktober 2003 - 17:30 #17
yeaaah! så snakker vi!

er der mulighed for at hente det første felt2 i emnet?
Avatar billede lademan Novice
10. oktober 2003 - 17:32 #18
kanon!!
Avatar billede nicklasb Nybegynder
10. oktober 2003 - 17:49 #19
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 :)

Men er det sådan noget lignende du søger?
Avatar billede lademan Novice
10. oktober 2003 - 17:52 #20
det første felt2 i emnet = det laveste ids felt2 (indenfor det samme emne)
Avatar billede nicklasb Nybegynder
10. oktober 2003 - 18:01 #21
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
Avatar billede lademan Novice
10. oktober 2003 - 18:02 #22
det er max klasse det du har lavet der! tak skal du have!
Avatar billede nicklasb Nybegynder
10. oktober 2003 - 18:05 #23
var sku så lidt :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?
Avatar billede lademan Novice
10. oktober 2003 - 18:19 #24
problemet er at jeg allerede har en forumtabel med en masse indhold...
http://www.surfersinfo.dk/forum
nuværende script er blot for tungt
Avatar billede olebole Juniormester
10. oktober 2003 - 18:26 #25
<ole>

Det er kun et problem, hvis du gør det til et  ;o)

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  :)

/mvh
</bole>
Avatar billede lademan Novice
10. oktober 2003 - 18:35 #26
første trin... æv, det var ikke meget
Avatar billede olebole Juniormester
10. oktober 2003 - 18:47 #27
Vi skal jo alle begynde et sted  ;o))
/mvh
Avatar billede nicklasb Nybegynder
10. oktober 2003 - 19:32 #28
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..
Avatar billede nicklasb Nybegynder
10. oktober 2003 - 19:32 #29
og et er så hvad man siger (skriver i dette tilfælde), noget andet er hvad man gør.. :D
Avatar billede olebole Juniormester
10. oktober 2003 - 19:50 #30
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
Avatar billede lademan Novice
10. oktober 2003 - 20:25 #31
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.
Avatar billede nicklasb Nybegynder
10. oktober 2003 - 20:29 #32
er de da ikke det?

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
Avatar billede lademan Novice
10. oktober 2003 - 20:35 #33
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.
Avatar billede lademan Novice
10. oktober 2003 - 20:38 #34
her ses det, at den dato, der er angivet, stemmer overens med "spørgsmålets dato"
Avatar billede lademan Novice
10. oktober 2003 - 22:16 #35
hvor på nettet kan jeg læse mere om MAX(), COUNT() etc ?
Avatar billede lademan Novice
10. oktober 2003 - 22:19 #36
COUNT() kommer vel fra PHP, men hvad med MAX og MIN? Er der nogle tutorials?
Avatar billede lademan Novice
10. oktober 2003 - 22:23 #37
Hmmm, ser ud til de også hører under PHP.
Kan flg kald lade sig gøre:

SELECT MAX(id) AS sortby, MAX(id) AS id FROM forum_indlaeg GROUP BY emne ORDER BY sortby DESC LIMIT 10
Avatar billede olebole Juniormester
10. oktober 2003 - 23:04 #38
MAX, MIN og COUNT er MySQL:
  http://www.mysql.com/doc/en/index.html
Avatar billede nicklasb Nybegynder
10. oktober 2003 - 23:20 #39
ja.. er almindelige SQL-kommandoer..

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?
Avatar billede olebole Juniormester
10. oktober 2003 - 23:52 #40
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
Avatar billede lademan Novice
11. oktober 2003 - 09:02 #41
ok, måske skulle jeg få gjort noget ved den databasestruktur så :-)
hvordan ser den hensigtsmæssige databasestruktur til et forum ud?
Avatar billede lademan Novice
11. oktober 2003 - 10:00 #42
Takker for hjælpen!
Avatar billede nicklasb Nybegynder
11. oktober 2003 - 10:16 #43
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..
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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