[PHP/MySQL] Laatste posts in forum

Pagina: 1
Acties:

  • Mini-me
  • Registratie: November 1999
  • Niet online
Ik ben bezig met het maken van een forum en nu wil ik een overzicht maken van de laatst geposte messages (topics en replies hierop).
MySQL databasestructuur:
-tabel 'topics' met hierin o.a.:
*topid_id
*datum/tijd
(en natuurlijk nog de dingen als auteur, titel en message)
-tabel 'replies' met hierin o.a.:
*reply_id
*topic_id waar de message een reply op is
*datum/tijd
(verder dezelfde dingen als de tabel 'topics'

Ik krijg het niet voor elkaar om een query te stellen die nu een overzicht maakt van de laatste X posts. Natuurlijk is een optie het apart weergeven van de laatste X topics en de laatste X replies maar ik wil juist de laatste X van het totaal.
Ik heb zitten denken aan dingen als innerjoin of outerjoin maar ik ben hier vastgelopen. Iemand een idee in welke richting ik het moet zoeken?

  • tomato
  • Registratie: November 1999
  • Niet online
Het is wel te doen, maar het zal geen mooie query worden. Mooier is om je db structuur aan te passen:

Tabellen Topic en Post:

Topic
-----
ID
Titel

Post
----
ID
TopicID
PostTijd
Tekst

En dan wordt de query om de laatste posts te selecteren triviaal.

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
tomato, zoiets heeft ie toch al?

Mini-me, bedoel je alleen de laatste replies? Dan wordt het:
code:
1
SELECT * FROM replies ORDER BY timestamp LIMIT X

volgens mij bedoel je iets anders, maar ik vind je vraag niet echt duidelijk.

  • tomato
  • Registratie: November 1999
  • Niet online
Op woensdag 24 oktober 2001 01:23 schreef marcusk het volgende:
tomato, zoiets heeft ie toch al?

Mini-me, bedoel je alleen de laatste replies? Dan wordt het:
code:
1
SELECT * FROM replies ORDER BY timestamp LIMIT X

volgens mij bedoel je iets anders, maar ik vind je vraag niet echt duidelijk.
Nee, hij heeft iets als:

Tabellen Topic en Reply:

Topic
-----
ID
PostTijd
Tekst

Reply
-----
ID
TopicID
PostTijd
Tekst


Wordt vervelend als je een sort wilt doen op topics en replies tegelijk ;)
In feite is zijn database model gewoon niet goed genormaliseerd.

  • Mini-me
  • Registratie: November 1999
  • Niet online
tomato> ja je hebt gelijk qua indeling.

Ik zal nog eens even nadenken of ik mijn database ga veranderen in de indeling die jij noemt, want het is op deze manier gewoon erg lastig om uit 2 verschillende tabellen een veld te pakken en dat te sorteren.

  • tomato
  • Registratie: November 1999
  • Niet online
Op woensdag 24 oktober 2001 01:35 schreef Mini-me het volgende:
tomato> ja je hebt gelijk qua indeling.

Ik zal nog eens even nadenken of ik mijn database ga veranderen in de indeling die jij noemt, want het is op deze manier gewoon erg lastig om uit 2 verschillende tabellen een veld te pakken en dat te sorteren.
Als je in posts wilt gaan zoeken zul je dit probleem weer tegenkomen ;)

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op woensdag 24 oktober 2001 01:29 schreef tomato het volgende:
Nee, hij heeft iets als:
...
Wordt vervelend als je een sort wilt doen op topics en replies tegelijk ;)
In feite is zijn database model gewoon niet goed genormaliseerd.
ah, zo :) dat is idd niet echt handig nee :)

  • paulh
  • Registratie: Juli 1999
  • Laatst online: 22-06 15:30
Het is niet erg mooi ... maar ik heb in de "topics" tabel gewoon een "last_change" veld zitten ... die geupdate wordt op het moment dat er een reply wordt toegevoegd ... vervolgens sorteer je daar op. (Maakt de query in iedergeval veel sneller)

[ZwareMetalen.com] - [Kom in aktie tegen de CO2 maffia]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op woensdag 24 oktober 2001 17:31 schreef paulh het volgende:
Het is niet erg mooi ... maar ik heb in de "topics" tabel gewoon een "last_change" veld zitten ... die geupdate wordt op het moment dat er een reply wordt toegevoegd ... vervolgens sorteer je daar op. (Maakt de query in iedergeval veel sneller)
Mooi zat toch :? Waarom niet ?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • tomato
  • Registratie: November 1999
  • Niet online
Op woensdag 24 oktober 2001 17:39 schreef drm het volgende:

[..]

Mooi zat toch :? Waarom niet ?
Omdat je data dubbel opslaat en het moeilijker wordt om de integriteit van je database te kunnen garanderen.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

tomato:

[..]

Omdat je data dubbel opslaat en het moeilijker wordt om de integriteit van je database te kunnen garanderen.
zit wel wat in, maar dat vind ik niet overtuigend. De tijd van posts is een veld in "posts" en de tijd laatste posting een veld in "fora". En die laatste kun je dmv. een query daarin zetten...

* drm zou het overigens gewoon adhv de laatste post in de posts-tabel doen, maar goed.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Mini-me
  • Registratie: November 1999
  • Niet online
Ik heb weer een vraagje.
Database ziet er nu dus zo uit:

Tabel topics:
-topic_id
-title

Tabel posts:
-post_id
-topic_id
-datetime
-author
-message
-ip

Voor het weergeven van de laatste 15 replies, wilde ik deze query gebruiken:
SELECT * FROM posts GROUP BY topic_id ORDER BY datetime DESC LIMIT 0, 10
(group by is nodig omdat hij anders ook meerdere replies in 1 topic weergeeft als laatste updates, en ik wil maximaal 1 reply per topic laten weergeven).
Alleen in dit geval wordt er een willekeurige tijd van een van de posts uit het topic opgeleverd (aangezien de 'group by' niet ordert op tijd).

Wat is er fout of wat vergeet ik aan deze query?

  • Mini-me
  • Registratie: November 1999
  • Niet online
Niemand? :'(

  • AK47
  • Registratie: Juli 2001
  • Laatst online: 04-05-2024
Laatste 15 replies..? Makelijk maak eerst een result van alle post in een topic, bv:
$result = mysql_db_query($dbNaam, "SELECT * FROM posts");

Daar haal je het totaal aantal posts uit:

$tot_posts = mysql_num_rows($result);

Dan trek 15 van het totaal af:

$tot_posts = $tot_posts - 15;

Dan kun je een result met een limit fixen:

$result = mysql_db_query($dbNaam, "SELECT * FROM posts LIMIT $tot_posts,15");

Ik hoop dat ik je zo heb geholpen ;)

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op zondag 04 november 2001 12:32 schreef Mini-me het volgende:
Wat is er fout of wat vergeet ik aan deze query?
MAX()

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op zondag 04 november 2001 18:30 schreef AK47 het volgende:
Laatste 15 replies..? Makelijk [...]
Sommige mensen HOREN niet te "programmeren" omdat ze in principe niet meer nadenken zodra ze een oplossing hebben gevonden, ook al is het een compleet foute oplossing, als het resultaat goed is vinden ze het best.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

Op zondag 04 november 2001 18:39 schreef dusty het volgende:

[..]

Sommige mensen HOREN niet te "programmeren" omdat ze in principe niet meer nadenken zodra ze een oplossing hebben gevonden, ook al is het een compleet foute oplossing, als het resultaat goed is vinden ze het best.
/me krijgt ook buikpijn van de gegeven oplossing...

Klaar voor een nieuwe uitdaging.


  • Mini-me
  • Registratie: November 1999
  • Niet online
Dusty>
zou je aub iets gedetailleerder kunnen zijn? Ik heb op www.mysql.com gezocht naar 'MAX' maar ik kon daar niets vinden.. wat houdt die syntax precies in?

  • tomato
  • Registratie: November 1999
  • Niet online
Op zondag 04 november 2001 18:44 schreef Mini-me het volgende:
Dusty>
zou je aub iets gedetailleerder kunnen zijn? Ik heb op www.mysql.com gezocht naar 'MAX' maar ik kon daar niets vinden.. wat houdt die syntax precies in?
MAX is een column functie te gebruiken in combinatie met een GROUP BY.

http://mysql.widexs.nl/doc/G/r/Group_by_functions.html

  • Mini-me
  • Registratie: November 1999
  • Niet online
Ik kom er nog niet echt uit.. Ik zou niet weten op wat voor manier ik die MAX() moet gebruiken.
Kan ik de GROUP BY forceren om de record met de laatste tijd op te leveren ipv een random tijd?

Verwijderd

Op zondag 04 november 2001 19:36 schreef Mini-me het volgende:
Ik kom er nog niet echt uit.. Ik zou niet weten op wat voor manier ik die MAX() moet gebruiken.
Kan ik de GROUP BY forceren om de record met de laatste tijd op te leveren ipv een random tijd?
select MAX(kolomnaam) as maximaal :?

  • Mini-me
  • Registratie: November 1999
  • Niet online
Volgens mij snapt men het probleem niet
Stel dat de laatste 5 replies als volgt zijn:
code:
1
2
3
4
5
6
post_id topic_id datetime etc
1    2    tijd1    ...
2    1    tijd2    ...
3    3    tijd3    ...
4    3    tijd4    ...
5    4    tijd5    ...

De query die ik heb:
SELECT * FROM posts GROUP BY topic_id ORDER BY datetime DESC LIMIT 0, 10
levert op:
code:
1
2
3
4
5
post_id topic_id datetime etc
1    2    tijd1    ...
2    1    tijd2    ...
4    3    tijd4    ...
5    4    tijd5    ...

Hierbij is het lang niet altijd zo dat tijd4 > tijd3.. daardoor kan het voorkomen dat de topics niet gesorteerd worden afgeleverd (aangezien de kans groot is dat een willekeurige tijd van een post in topic 1 ouder is dan een tijd van een post in topic 2, terwijl hij toch als nieuwer beschouwd wordt)

Is het zo duidelijk?
Wat moet ik veranderen aan de query?

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op zondag 04 november 2001 20:00 schreef Mini-me het volgende:
Is het zo duidelijk?
Was ut al.
Wat moet ik veranderen aan de query?
MAX() erbij verwerken.

Als jij een nieuwe reactie toevoegd aan de database is dat altijd de nieuwste tijd. Dat is tevens de MAX() van die kolom als je dan groepeert op de topic_id pakt hij de nieuwste tijd van elke topic_id (dus de laatste) daarop kan je ook meteen sorteren.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Mini-me
  • Registratie: November 1999
  • Niet online
OK
maar op welke plaats gebruik ik die max dan?

Misschien zoiets?
SELECT * FROM posts GROUP BY topic_id, MAX(datetime) ORDER BY datetime

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op zondag 04 november 2001 20:22 schreef Mini-me het volgende:
Misschien zoiets?
SELECT * FROM posts GROUP BY topic_id, MAX(datetime) ORDER BY datetime
Nope.

selecteer de velden die je wilt hebben apart ipv gebruik te maken van de *.

Je kan het zo gebruiken :
code:
1
2
3
4
5
6
7
8
select 
  Max(tijdje) as maxi, 
  topicid 
from 
  tabelleke 
group by topicid 
order by maxi desc 
limit 0,10

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Mini-me
  • Registratie: November 1999
  • Niet online
Thx het werkt eindelijk :)

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op zondag 04 november 2001 20:47 schreef Mini-me het volgende:
Thx het werkt eindelijk :)
Volgens mij zou een toekomstige persoon die de search gaat gebruiken heel dankbaar zijn als jij jouw oplossing plaatst ;)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Mini-me
  • Registratie: November 1999
  • Niet online
Er was iemand voor mij die de oplossing al geplaatst heeft:
Op zondag 04 november 2001 20:39 schreef dusty het volgende:

[..]
code:
1
2
3
4
5
6
7
8
select 
  Max(tijdje) as maxi, 
  topicid 
from 
  tabelleke 
group by topicid 
order by maxi desc 
limit 0,10
Ik heb het vrijwel letterlijk zo gedaan, op wat detail na (variabele gebruikt bij LIMIT en andere kolomnamen maar precies dezelfde structuur)

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Op zondag 04 november 2001 21:01 schreef dusty het volgende:

[..]

Volgens mij zou een toekomstige persoon die de search gaat gebruiken heel dankbaar zijn als jij jouw oplossing plaatst ;)
Welke search? :o

Programmer - an organism that turns coffee into software.


  • tomato
  • Registratie: November 1999
  • Niet online
LuCarD: Welke search? :o
Onno's search >:)

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Op zondag 04 november 2001 21:29 schreef tomato het volgende:

[..]

Onno's search >:)
Wat is ook al weer het URL ?? Kan hem niet vinden...

Programmer - an organism that turns coffee into software.


  • tomato
  • Registratie: November 1999
  • Niet online
LuCarD:
Wat is ook al weer het URL ?? Kan hem niet vinden...
onno.dhs.org

Of kijk even in Onno's sig natuurlijk ;)

[/off-topic]
Pagina: 1