Avatar billede xsix Nybegynder
24. januar 2010 - 05:02 Der er 9 kommentarer og
1 løsning

Query fra 2 tabeller

Hej Eksperter.

Jeg sidder og roder med noget forum, hvor jeg prøver at få en liste frem med tråde, som skal være sorteret efter hvilken der sidst er skrevet i.

Jeg har 3 tabeller.
1. board_forum: id, name
2. board_topic: id, name, board_forumID
3. posts: id, board_topicID, posttime

Jeg skal så kunne gå ind og få en liste af board_topic's (tråde) indenfor et board_forum ID, og denne liste af board_topic skal være sorteret efter posttime fra posts.

Det jeg indtil videre har fået lavet er disse 2 forskellige men meget ens querys, men ingen af dem sorterer korrekt efter posttime:

$queryt = mysql_query("SELECT DISTINCT board_topic.* FROM board_topic JOIN posts ON board_topic.id=posts.topicid WHERE board_topic.forumid='$forum[id]' AND board_topic.readlevel<='$user_data[usertype]' ORDER BY posts.posttime DESC");


$queryt = mysql_query("SELECT DISTINCT board_topic.id, board_topic.name, posts.posttime FROM board_topic, posts WHERE board_topic.forumid='$forum[id]' AND posts.topicid=board_topic.id AND board_topic.readlevel<='$user_data[usertype]' GROUP BY board_topic.id ORDER BY posts.posttime DESC");

Jeg kører så disse querys igennem et while loop hvor jeg echo'er hvert topic (tråd), viser hvor længe siden der sidste er skrevet, osv.

Håber i kan hjælpe mig.

Mvh.
Jesper Sandberg
24. januar 2010 - 08:44 #1
Jeg vil foreslaa denne query: 

$queryt = mysql_query("SELECT bt.id, bt.name, p.posttime FROM board_topic bt INNER JOIN posts p ON bt.id = p.board_topicID WHERE bt.board_forumID = $forum[id] ORDER BY p.posttime");

Kommentar:  Jeg antager at $forum[id] er en talvaerdi som brugeren vaelger i en form.  Fordi jeg ikke ved hvad board_topic.readlevel er skippede jeg det (det fremgaar ikke af dine tabeller.)

For test lavede jeg tre tabeller xsix_board_forum, xsix_board_topic, og xsis_posts med de felter du angav og puttede nogle vaerdier i som jeg gengiver nedenfor.  Jeg lavede saa en hjemmeside (hvor jeg i mangel af en bruger-defineret $forum[id] laver min egen og putter den i $id.)  Du kan se hjemmesiden her:  http://christianjorgensen.be/xsix.php.  Den giver den foelgende udskrift:

forum id: 1 topic name: topic1 posttime: 2010-01-12 12:13:14
forum id: 5 topic name: topic5 posttime: 2010-01-14 12:10:14
forum id: 5 topic name: topic5 posttime: 2010-01-15 12:12:14
forum id: 5 topic name: topic5 posttime: 2010-01-17 12:12:16

Her kommer saa koden til hjemmesiden og indholdet i de tre tabeller:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <title></title>
</head>

<body>
<?
$link = mysql_connect ('christianjorgensen.be.mysql', 'christianjoygen', 'dnyBKKbe') or die(mysql_erorr());
mysql_select_db('christianjoygen') or die('Could not select database');
$id = $forum[id];
$id = 2;
$queryt = mysql_query("SELECT bt.id, bt.name, p.posttime FROM xsix_board_topic bt INNER JOIN xsix_posts p ON bt.id = p.board_topicID WHERE bt.board_forumID = $id ORDER BY p.posttime");
while($row = mysql_fetch_array($queryt))
echo "forum id: " . $row[id] . " topic name: " . $row[name] . " posttime: " . $row[posttime] . "<br/>";
mysql_close($link); 
?> 
</body>
</html>

CREATE TABLE xsix_board_forum(id INT, name VARCHAR(10));
CREATE TABLE xsix_board_topic(id INT, name VARCHAR(10), board_forumID INT);
CREATE TABLE xsix_posts(id INT, board_topicID INT, posttime DATETIME);

INSERT INTO xsix_board_forum VALUES(1, 'forum1');
INSERT INTO xsix_board_forum VALUES(2, 'forum2');
INSERT INTO xsix_board_forum VALUES(3, 'forum3');

INSERT INTO xsix_board_topic VALUES(1, 'topic1', 2);
INSERT INTO xsix_board_topic VALUES(2, 'topic2', 3);
INSERT INTO xsix_board_topic VALUES(3, 'topic3', 3);
INSERT INTO xsix_board_topic VALUES(4, 'topic4', 1);
INSERT INTO xsix_board_topic VALUES(5, 'topic5', 2);
INSERT INTO xsix_board_topic VALUES(6, 'topic6', 1);


INSERT INTO xsix_posts VALUES(1, 1, '2010-01-12 12:13:14');
INSERT INTO xsix_posts VALUES(2, 2, '2010-01-12 12:13:24');
INSERT INTO xsix_posts VALUES(3, 3, '2010-01-13 12:13:34');
INSERT INTO xsix_posts VALUES(4, 2, '2010-01-13 12:13:44');
INSERT INTO xsix_posts VALUES(5, 5, '2010-01-14 12:10:14');
INSERT INTO xsix_posts VALUES(6, 2, '2010-01-14 12:11:14');
INSERT INTO xsix_posts VALUES(7, 5, '2010-01-15 12:12:14');
INSERT INTO xsix_posts VALUES(8, 2, '2010-01-16 12:12:15');
INSERT INTO xsix_posts VALUES(9, 5, '2010-01-17 12:12:16');
24. januar 2010 - 08:47 #2
med en lille rettelse hvis du ville have posttiderne per topic sorteret med den nyeste foerst, ORDER BY p.posttime DESC.
Avatar billede xsix Nybegynder
24. januar 2010 - 10:52 #3
Det giver desværre stadig samme resultat.

$forum[id] og readlevel var ikke relavante for selve queryet og dette while loop, det var derfor jeg valgte ikke at skrive noget yderligere om dem.

Som det også fremgår af dit resultat:
forum id: 1 topic name: topic1 posttime: 2010-01-12 12:13:14
forum id: 5 topic name: topic5 posttime: 2010-01-14 12:10:14
forum id: 5 topic name: topic5 posttime: 2010-01-15 12:12:14
forum id: 5 topic name: topic5 posttime: 2010-01-17 12:12:16

Så printer den topic5 ud 3 gange, og hvert topic skulle kun fremstå 1 gang, men i rangorden efter posttime "inde" fra hvert topic.
24. januar 2010 - 11:26 #4
Saa har jeg ikke forstaaet hvad du er efter.  Proev at vise hvordan du gerne vil have resultatet til at se ud.
Avatar billede xsix Nybegynder
24. januar 2010 - 11:51 #5
Hvis vi tager udgangspunkt i mine 3 tabeller.
1. board_forum: id, name
2. board_topic: id, name, board_forumID
3. posts: id, board_topicID, posttime

Så kunne board_forum have navnet "Generelt" og være id nr 1.

Inde under dette forum kan brugere så oprette et topic (board_topic), id er automatisk og name bestemmer brugeren og forum id bliver taget fra der hvor topic bliver oprettet.

Posts her så de forskellige indlæg der er skrevet i et given topic, hver post har så et automatisk id, samt topic id, så man kan se hvilket topic det er skrevet i. Så er der posttime hvilket er tidspunktet hvor beskeden er blevet skrevet.

------

Det jeg så gerne vil have frem er listen af de brugeroprettede topic's under et given forum id, dette har jeg også fået.
Men, jeg vil gerne have at listen hele tiden er sådan at det topic der sidst er blevet skrevet i, skal ligge øverst på listen, osv i den dur.

Her er et screenshot som forumet ser ud nu under forum id 1 med dit query: http://peecee.dk/uploads/012010/forum1_big_thumb.JPG
Avatar billede xsix Nybegynder
24. januar 2010 - 12:03 #6
Hvis jeg sætter "GROUP BY bt.id" på queryet kommer det rigtige antal topics ud, men ikke sorteret efter posttime.
24. januar 2010 - 12:47 #7
xsix, jeg har ikke forstaaet forskellen paa hvad du vil (hvad dit link viser) og, bortset fra layout, det resultat jeg viser naar vi, som sagt i #2 sorterer DESC:

forum id: 5 topic name: topic5 posttime: 2010-01-17 12:12:16
forum id: 5 topic name: topic5 posttime: 2010-01-15 12:12:14
forum id: 5 topic name: topic5 posttime: 2010-01-14 12:10:14
forum id: 1 topic name: topic1 posttime: 2010-01-12 12:13:14

Dit link viser, antageligt for et udvalgt forum, et antal topics og for hvert topic et antal indlaeg.  Alle indlaeg for et topic synes at vaere kommet paa samme tid.  Jeg viser ligeledes for et antal (2) topics et antal indlaeg, sorteret saa indenfor hvert indlaeg det seneste er oeverst.

Gider du, som jeg spurgte om i # 4, skrive ud hvordan du, hvis der er to topics, 'topic5' og 'topic1' hvor 'topic5' har tre indlaeg og 'topic1' har 1 indlaeg, oensker resultatet formatteret?  Saa kan vi komme videre.

Efterskrift:  Hvis den eneste forskel er at du ikke vil have tiden skrevet ud men hvor laenge siden saa sig det og vi kan lave det.  Ellers saa specificer hvor mit resultat ikke dur og hvad det skal vaere i stedet.
Avatar billede xsix Nybegynder
24. januar 2010 - 13:14 #8
Quote: "Dit link viser, antageligt for et udvalgt forum, et antal topics og for hvert topic et antal indlaeg.  Alle indlaeg for et topic synes at vaere kommet paa samme tid.  Jeg viser ligeledes for et antal (2) topics et antal indlaeg, sorteret saa indenfor hvert indlaeg det seneste er oeverst."
-Jeg tror du mistår det, det jeg viser i linket er forkert og ikke sådan som jeg vil have det. Du skal tænke på at hver topic svarer til et spørgsmål herinde, hvor man så kan trykke ind på det og læse de forskellige indlæg, hvert topic skal jo derfor kun vises én gang uanset hvor mange posts der er inde i det.

Quote: "Gider du, som jeg spurgte om i # 4, skrive ud hvordan du, hvis der er to topics, 'topic5' og 'topic1' hvor 'topic5' har tre indlaeg og 'topic1' har 1 indlaeg, oensker resultatet formatteret?  Saa kan vi komme videre."
-Hvis man tager ud fra dit eksempel med 3 indlæg i topic5 og 1 indlæg i topic1, skulle resultatet se således ud:
forum id: 5 topic name: topic5 posttime: 2010-01-17 12:12:16
forum id: 1 topic name: topic1 posttime: 2010-01-12 12:13:14
24. januar 2010 - 13:40 #9
Du vil altsaa have alle topics for det udvalgte forum, og for hvert topic have den sidste posttime?  Det kunne du da godt have sagt med det samme.  Paa mit dansk taler man om at sortere naar man har mange af en slags og vil have dem alle men i en bestemt orden.

Saa hvis du aendrer din query til det foelgende faar du dette resultat: 

forum id: 1 topic name: topic1 posttime: 2010-01-12 12:13:14
forum id: 5 topic name: topic5 posttime: 2010-01-17 12:12:16

Her er koden, og du kan proeve den ud paa http://christianjorgensen.be/xsix.php

$queryt = mysql_query("SELECT bt.id, bt.name, MAX(p.posttime)AS maxtime  FROM xsix_board_topic bt INNER JOIN xsix_posts p ON bt.id = p.board_topicID WHERE bt.board_forumID = $id GROUP BY bt.name ORDER BY bt.name");
while($row = mysql_fetch_array($queryt))
echo "forum id: " . $row[id] . " topic name: " . $row[name] . " posttime: " . $row['maxtime'] . "<br/>";

Jeg poster dette som svar idet jeg mener at have besvaret dit spoergsmaal.
Avatar billede xsix Nybegynder
24. januar 2010 - 13:52 #10
Ah perfekt, det var bare denne MAX AS jeg ikke lige kendte til.

Synes også det var sådan jeg forklarede det første gang.

Ændrede query til:
$queryt = mysql_query("SELECT bt.id, bt.name, MAX(p.posttime)AS maxtime FROM board_topic bt INNER JOIN posts p ON bt.id = p.topicid WHERE bt.forumid = '$forum[id]' AND bt.readlevel<='$user_data[usertype]' GROUP BY bt.name ORDER BY maxtime DESC");
og nu virker det hele som det skal.

Mange tak for hjælpen, og beklager hvis det var lidt besværligt at finde ud af hvad jeg mente.
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