Toon posts:

Forum SQL

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi jongens, ik ben nu al 2 weken bezig met een SQL script.. Ik heb verschillende dingen al geprobeerd, maar niets wil echt lukken :(

/me is op zoek naar een SQL expert :)

Ik ben bezig met een forum in php. Hij staat al bijna, maar met het overzicht klopt nog het een en ander niet...

Dit is mijn tabel tblForumMsg:
code:
1
2
3
4
5
6
7
8
9
10
11
12
mysql> explain tblforummsg;
+--------------+--------------+------+-----+---------+----------------+
| Field   | Type       | Null | Key | Default | Extra       |
+--------------+--------------+------+-----+---------+----------------+
| MsgID   | int(10) |   | PRI | NULL    | auto_increment |
| MsgPoster    | int(10)    | YES  |     | NULL    |            |
| MsgTitel     | varchar(150) | YES  |     | NULL    |          |
| MsgTekst     | text      | YES  |     | NULL    |         |
| MsgDateTime  | datetime     | YES  |     | NULL    |          |
| MsgBelongsTo | int(10)    | YES  |     | NULL    |            |
| MsgReplyTo   | int(10)    | YES  |     | NULL    |            |
+--------------+--------------+------+-----+---------+----------------+

De topics en reacties staan allebei in deze tabel, de fora en boards in andere tabellen... Verder is er nog een usertabel.

Een bericht is een topic als MsgReplyTo NULL is, anders een reactie op het nummer wat het bevat.

Dit is nu de uitvoer:
jaja, het is een site voor kinderen :)
Afbeeldingslocatie: http://213.51.151.22/got/forum.gif

Mijn probleem:
Ik krijg het maar niet voor elkaar om een topic bovenaan te krijgen als het een nieuwe reaktie heeft. Ook lukt het niet om de datum te krijgen van de laatste reactie.

SQL:
code:
1
2
3
4
SELECT tblForumMsg.MsgID, tblForumMsg.MsgTitel, tblForumMsg.MsgDatetime,tblForumUser.UserNickName
FROM tblForumMsg
INNER JOIN tblForumUser ON tblForumMsg.MsgPoster = tblForumUser.UserID
WHERE MsgReplyTo IS NULL AND MsgBelongsTo=$topic;

($topic is de link naar de topic uit de tabel tblForumTopic, meegegeven in een querystring)

De fout is, is dat ik in mijn SQL-query WHERE MsgReplyTo IS NULL heb, en dus de reacties buitensluit. Ik zou niet weten hoe ik het anders kan doen...

De enige oplossing die ik zou kunnen bedenken is om alle berichten op vragen in de eerste string, en dan pas in de code uitvoer weergeven als MsgReplyTo NULL is. Dan nóg een query gebruiken om alle reacties op te tellen en de laatste reactie weer te geven.. Maar dat betekent dus dat ik per telkens 10/15 keer een query moet uitvoeren :(

Dit moet toch in één SQL-string te doen zijn?? Misschien iets in de richting van self-joins ofzow?

Graag wat help alsjeblieft, ik ben nog niet zo heel erg goed in joins :(

Bedankt!

  • Vulpecula
  • Registratie: April 2001
  • Laatst online: 23:05
Zet eens achter aan ORDER BY tblforummsg.MsgDateTime

dus zo:
PHP:
1
2
3
4
5
6
<?
SELECT tblForumMsg.MsgID, tblForumMsg.MsgTitel, tblForumMsg.MsgDatetime,tblForumUser.UserNickName
FROM tblForumMsg
INNER JOIN tblForumUser ON tblForumMsg.MsgPoster = tblForumUser.UserID
WHERE MsgReplyTo IS NULL AND MsgBelongsTo=$topic ORDER BY tblForumMsg.MsgDateTime;
?>

Verwijderd

Topicstarter
Dat maakt niets uit, omdat ik al heb aangegeven in de qury dat MsgReplyTo NULL moet zijn, dus hij selecteert alleen de topics en niet de reacties...

Dus dan komt een topic nog niet bovenaan te staan, ook al is een reactie op die topic heel recent..

Aan de andere kant, als ik dat weglaat uit de query, dan krijg ik dus alle berichten (topics én reacties) onder elkaar...

Verwijderd

Topicstarter
hmm, weinig enthousiastelingen zo te zien :)

ik ga nu slapen, zie morgen wel weer verder...

Trusten!

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 14:02
Ik heb het bericht maar half doorgelezen.

Misschien zo? (de tijd als aparte SELECT nemen.)
SELECT tijd ORDER BY tijd DESC WHERE ID='$id' FROM tabel.naam

en dan nog zorgen dat hij alleen de bovenste pakt. Maar dat moet niet moeilijk zijn.

met bovenstaande select krijg je een rijtje met tijden van een bepaald messages[TopicID]. Ze staan al vanaf de nieuwste tijd bovenaan, dus je hoeft alleen de bovenste te pakken.

Je moet niet op de details letten van m'n SELECT. zoals ik al had gezegd, ik had bericht maar half doorgelezen, en ik ga het ook niet helemaal doorlezen. Dus ID kan gerust msgid zijn. :)

Verwijderd

Topicstarter
Op maandag 05 november 2001 02:14 schreef Cheater het volgende:
Misschien zo? (de tijd als aparte SELECT nemen.)
SELECT tijd ORDER BY tijd DESC WHERE ID='$id' FROM tabel.naam [...]
Ook dit zal niet werken :(
Ik moet dus niet alleen een apart rijtje met tijden hebben, maar ook MsgTitel, MsgID en MsgPoster hebben. Als ik een aparte select zou doen gaat het ook niet werken denk ik..

Of bedoel je soms dat ik eerst een select maak waarin ik die andere gegevens ophaal (waar MsgReplyTo IS NULL), en dan tijdens de while telkens die tijdselect van jou maak?

Hmm.. Lijkt me wel vel performance kosten.. Misschien kan ik een array maken met de tijden en die dan weer gebruiken bij het afspelen van de while loop...

In ieder geval: SELECT ... FROM tabel.naam gaat volgens mij zowieso niet door de parser heen :)

Misschien wel FROM tabelnaam óf database.tabelname :)


Iemand een beter idee?

[edit]typefoutje..[/edit[

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 22:34
Op maandag 05 november 2001 07:54 schreef BarisArt het volgende:
In ieder geval: SELECT ... FROM tabel.naam gaat volgens mij zowieso niet door de parser heen :)

Misschien wel FROM tabelnaam óf database.tabelname :)
[edit]typefoutje..[/edit[
Ehm, zoiets werkt dus wel:
code:
1
SELECT t.* FROM tabelnaam AS t WHERE t.id = $blaat

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

dusty

Celebrate Life!

Ik gok erop dat heel toevallig ongeveer dezelfde vraag nog DEZE week al gesteld is.

Ik gok erop dat heel toevallig daar de oplossing ook te vinden valt.

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


Verwijderd

Topicstarter
Tuurlijk Dusty,

Hij lijkt er idd op, maar die had ik natuurlijk wel gelezen :)

Mijn probleem is echter nog steeds dat de databasestructuur niet helemaal geweldig is, omdat ik posts en reply's in de zelfde tabel heb. Ik hou ze uit elkaar door te kijken of MsgReplyTo NULL is...

Het moet toch wel te doen zijn, door een of andere vage inner-join om die tabel te gebruiken?

Max(tijdje) was ik zelf ook nog wel opgekomen, maar als ik gewoon max(tijdje) gebruik krijg ik ook de ID's en titels van de replies. Als ik max(tijdje) WHERE MsgReplyTo IS NULL gebruik, krijg ik weer niet de tijden van de replies

*zucht*

Ik hoop dat het allemaal nog een beetje duidelijk is? |:(

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

dusty

Celebrate Life!

Op maandag 05 november 2001 10:10 schreef BarisArt het volgende:
Mijn probleem is echter nog steeds dat de databasestructuur niet helemaal geweldig is, omdat ik posts en reply's in de zelfde tabel heb. Ik hou ze uit elkaar door te kijken of MsgReplyTo NULL is...
Betere database gebruiken of betere database model.

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


Verwijderd

Topicstarter
Dus dit is volgens jou niet op te lossen met een iets gecompliceerdere SQL-query?

(wie daagt dusty uit?) :)

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

dusty

Celebrate Life!

Op maandag 05 november 2001 11:10 schreef BarisArt het volgende:
Dus dit is volgens jou niet op te lossen met een iets gecompliceerdere SQL-query?

(wie daagt dusty uit?) :)
Niet binnen één query met MySQL.

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


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

verander het datamodel nu het nog kan..

ingewikkelde queries zijn vaak onleesbaar, traag en slecht onderhoudbaar (als je geen sql-expert bent ;) )

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 22:34
Op maandag 05 november 2001 11:17 schreef wasigh het volgende:
verander het datamodel nu het nog kan..

ingewikkelde queries zijn vaak onleesbaar, traag en slecht onderhoudbaar (als je geen sql-expert bent ;) )
Als ik het zo zie, dan is het database model al zo brk als maar kan. Lijkt me dus idd. meteen aanpassen. Mn eigen forum gebruikt niet eens een erg ingewikkelde query, het is gewoon een kwestie van denken en dan doen.

Verwijderd

Topicstarter
Hmm, shit :(
had het hele forum al staan, en het werkte (bijna) goed...

het is idd waar dat het databasemodel niet helemaal genormaliseerd is.
Gewoon niet goed over nagedacht bij de opbouw blijkbaar :)

Nou..... Heb ik weer mooi wat te doen vanavond.. :'(

Thanx anyway
Pagina: 1