[MySQL/PHP]Moeilijke query, mogelijk?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Ben druk aan het werk met een simpel forum. In principe is ie bijna af zelfs.
Ik zit enkel met 1 puntje, ik wil het topic waarin het laatst gereageerd is bovenaan in de lijst hebben staan. Ik wil echter ook wat andere informatie van de poster uit een andere tabel trekken.

Waar het op neer komt is dat ik dus 3 tabellen heb waar ik informatie uit nodig heb. Tabel 1 met de topics, tabel 2 met de gegevens van de users en tenslotten tabel 3 met de forumreacties.

De tabellen :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE TABLE users
    (
    uid int(10) DEFAULT '0' NOT NULL auto_increment,
    roepnaam varchar(20) NOT NULL,
    achternaam varchar(30) NOT NULL,
    PRIMARY KEY(uid)
);

CREATE TABLE forum
    (
    fid int(10) DEFAULT '0' NOT NULL auto_increment,
    titel varchar(120) NOT NULL,
    poster int(10) NOT NULL,
    bericht tinytext NOT NULL,
    timestamp DATETIME,
    PRIMARY KEY(fid)
);

CREATE TABLE forumreacties
    (
    frid int(10) DEFAULT '0' NOT NULL auto_increment,
    fid int(10) NOT NULL,
    poster int(10) NOT NULL,
    bericht tinytext NOT NULL,
    timestamp DATETIME,
    PRIMARY KEY(frid)
);


Heb er een aantal velden uitgehouden en enkel het relevante deel overgehouden.

Mijn huidige query die alles ophaalt :

code:
1
2
3
4
5
SELECT fid, titel, bericht, poster, status, timestamp, users.roepnaam, users.achternaam 
FROM forum,users 
WHERE forum.poster=users.uid 
ORDER BY forum.fid 
DESC

Hiermee krijg ik netjes alle info die ik nodig heb om het overzicht te krijgen over de topics. Nu wil ik dus enkel nog dat het topic met de laatste reactie bovenaan komt.

Alleen hoe doe ik dit :? Ik had al wat zitten vogelen door enkel de twee tabellen voor het forum te gebruiken los van de userinfo. Als ik echter het volgende doe :

code:
1
2
3
4
SELECT forum.fid 
FROM forum, forumreacties 
ORDER BY forumreacties.frid, forum.fid 
DESC;


Dan krijg ik wel netjes het topic van de laatste reactie bovenaan, maar het blijft dan niet bij de 2 topics, maar die lijst gaat net zo lang door tot het aantal reacties. Terwijl het bij het aantal topics moet blijven. Hoe limit ik dat goed? Als ik met LIMIT 0,x ga limieten dan limit ik op de reacties, niet op de topics.

Kan iemand me op weg helpen?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

code:
1
2
3
4
5
6
SELECT fid, titel, bericht, poster, status, timestamp, users.roepnaam, users.achternaam, MAX(forumreacties.datum) AS laatstereply
FROM forum,users, forumreacties 
WHERE forum.poster=users.uid
AND forum.fid = forumreacties.fid
GROUP BY fid, titel, bericht, poster, status, timestamp, roepnaam, achternaam
ORDER BY laatstereply DESC

Zoiets misschien? Untested though, en ik ben niet echt goed met GROUP BY queries. :+

In verband met performance is het misschien trouwens beter een extra veld op te nemen in je topic-tabel (als je die tenminste hebt). Soms is het handiger om iets te denormaliseren als daar de snelheid van je systeem bij gebaat is. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Een exra veld in de tabel forum met de timestamp van de laatste reactie dus? En al zou ik dat doen, hoe haal ik die dan op? Iemand een url waar duidelijk uitgelegd staat hoe je query's met data opstelt :?

edit :

Ok, gelukt. Ik heb een extra veld lastreply gemaakt dus like zo :

code:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE forum
    (
    fid int(10) DEFAULT '0' NOT NULL auto_increment,
    titel varchar(120) NOT NULL,
    poster int(10) NOT NULL,
    bericht tinytext NOT NULL,
    status tinyint(1) NOT NULL,
    ip varchar(20) NOT NULL,
    timestamp DATETIME NOT NULL,
    lastreply DATETIME NOT NULL,
    PRIMARY KEY(fid)
);


Nu zet ik ORDER by forum.lastreply neer en dan werkt het.

[ Voor 54% gewijzigd door Cartman! op 10-03-2005 10:36 ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Je kunt het ook (tegen redundantie en dat soort geneuzel) met het ID van het laatst geplaatste bericht doen, in plaats van de datum tweemaal te plaatsen (in het bericht zelf en in het topic).

Maar die keuze (nóg een query, om de datum uit de berichtentabel te halen) moet je zelf afwegen.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

Waarom heb je twee aparte tabellen voor topics en reacties?
Topic en reacties zijn allebei berichten en horen dus gewoon in dezelfde tabel.
En dan wordt het gelijk een stuk makkelijker om de laatst geposte berichten op te halen. ;)

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Verwijderd schreef op donderdag 10 maart 2005 @ 12:07:
Waarom heb je twee aparte tabellen voor topics en reacties?
Topic en reacties zijn allebei berichten en horen dus gewoon in dezelfde tabel.
En dan wordt het gelijk een stuk makkelijker om de laatst geposte berichten op te halen. ;)
Dat is zo ja...misschien dak maar overnieuw begin dan.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op donderdag 10 maart 2005 @ 12:07:
Waarom heb je twee aparte tabellen voor topics en reacties?
Topic en reacties zijn allebei berichten en horen dus gewoon in dezelfde tabel.
En dan wordt het gelijk een stuk makkelijker om de laatst geposte berichten op te halen. ;)
Dat ben ik niet helemaal met je eens. Een topic is een topic, en heeft reacties. Hoewel je altijd met 1 reactie begint, zie ik het toch los staan van het topic concept. Ik zou er wel twee tabellen voor houden.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • m33p
  • Registratie: September 2002
  • Laatst online: 05-09 15:26
Idd, das hetzelfde als nieuwsposts en nieuwscomments in 1 tabel gooien, dat doe je ook niet :/

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Michali schreef op donderdag 10 maart 2005 @ 13:46:
Dat ben ik niet helemaal met je eens. Een topic is een topic, en heeft reacties. Hoewel je altijd met 1 reactie begint, zie ik het toch los staan van het topic concept. Ik zou er wel twee tabellen voor houden.
Daarop verder bordurend: een topic heeft toch aanzienlijk andere velden dan een post. Zo kun je een topic op slot gooien, en een post niet. Zelfde voor sticky. Verder heeft een topic een titel, en een post over het algemeen niet, en zo kunnen we nog wel even verder gaan. Topics en posts samenvoegen bespaart je misschien werk, maar je krijgt er een hoop redundantie door. Redundantie die echt niet nodig is in dit geval, omdat het amper scheelt in performance. Dat ik aanraad om in een topic-tabel dan toch wel een datum op te nemen voor de laatste post, is dat aggregate functies over het algemeen toch iets zwaarder zijn op je database. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Ik ben iets te onduidelijk geweest.
Als je zoiets hebt:

Topic:
-id
-titel
-enz

Reacties:
-id
-topicid
-bericht
-datum
-enz

Nu is het veel makkelijker om alles te selecteren.En de startpost is dan gewoon de eerste reactie.
Zo vervallen alle nadelen die jullie genoemd hebben, en wordt het veel makkelijker om de laatste reactie te selecteren. :+

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op donderdag 10 maart 2005 @ 21:02:
Ik ben iets te onduidelijk geweest.
Als je zoiets hebt:

Topic:
-id
-titel
-enz

Reacties:
-id
-topicid
-bericht
-datum
-enz

Nu is het veel makkelijker om alles te selecteren.En de startpost is dan gewoon de eerste reactie.
Zo vervallen alle nadelen die jullie genoemd hebben, en wordt het veel makkelijker om de laatste reactie te selecteren. :+
Je zei precies het omgekeerde. :+ Anyway, dat bedoelen wij ook. Ik zie nou overigens pas dat TS dat op zo'n dubbele/vage manier aanpakt; dat is inderdaad niet erg handig nee. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op donderdag 10 maart 2005 @ 21:52:
[...]

Je zei precies het omgekeerde. :+ Anyway, dat bedoelen wij ook. Ik zie nou overigens pas dat TS dat op zo'n dubbele/vage manier aanpakt; dat is inderdaad niet erg handig nee. :)
Ik zie zelf nu ook dat mijn post niet helemaal deugde, maar ik bedoelde het goed. ;)
Verder maakte ik uit de andere posts op dat zij de structuur van de TS zo wilde houden, en daar ging ik tegenin. :+

Acties:
  • 0 Henk 'm!

Verwijderd

Je hebt in je query geen link gelegd tussen de tabel forum en de tabel forumreacties. Je krijgt dan dus voor ieder record in de tabel forum alle records van de tabel forumreacties te zien.

SELECT forum.fid
FROM forum, forumreacties
ORDER BY forumreacties.frid, forum.fid
DESC;

had dus moeten zijn

SELECT forum.fid
FROM forum, forumreacties
WHERE forum.fid = forumreacties.fid
ORDER BY forumreacties.frid, forum.fid
DESC;

en ja, dit is m'n eerste post naar een forum, dus sorry voor de opmaak.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Bedankt voor de vele info, maar het is allemaal gelukt. Had al besloten om het 2 tabellen te houden vanwege bovengenoemde redenen. En ook de topics komen prima naar boven nu met laatste reactie met een simpele query.

Mn forum kan iig. topics op slot zetten ook dus ja, alles prima in orde :)
Pagina: 1