Avatar billede sokken Nybegynder
09. januar 2012 - 22:19 Der er 1 kommentar og
1 løsning

Problemer med inner Joins og Limit

Jeg har ved hjælp af en tidligere tråd fundet frem til dette:

$result = dbquery("
SELECT tt.thread_id, tt.thread_subject, tp.post_message, tp.post_datestamp FROM (
".DB_POSTS." tp INNER JOIN ".DB_FORUMS." tf ON tp.forum_id=tf.forum_id )
INNER JOIN ".DB_THREADS." tt ON tf.forum_id=tt.forum_id
WHERE tp.forum_id='4' ORDER BY post_datestamp DESC LIMIT 0,5");

if (dbrows($result)) {
    while($data = dbarray($result)) {
        $itemsubject = trimlink($data['thread_subject'], 30);
        $itemmessage = trimlink($data['post_message'], 250);
        echo THEME_BULLET." <a href='".FORUM."viewthread.php?thread_id=".$data['thread_id']."' title='".$data['thread_subject']."' class='side'><span style='color:#990000'>$itemsubject</span><br />$itemmessage <em>Læs mere</em>...</a><hr />\n";
    }
} else {
    echo "<div style='text-align:center'>".$locale['global_023']."</div>\n";}

Den viser som den skal, 5 poster hvor thread_subject er overskriften og post_message er selve artiklen.

Problem 1:
Der er oprettet 4 artikler som vises med den ældste først. MEN den vil have der skal være 5 alligevel, og viser derfor nr. 1 igen.

Problem 2:
Jeg vil gerne have den til at vise den nyeste artikkel først, og ændrede derfor til ASC Limit, her viser den korrekt post_message med nyeste først (ASC), MEN overskrifterne forbliver vist som ældste (DESC) først. Derved passer overskrift og artikkel ikke sammen.

Er der en venlig sjæl, der kan hjælpe mig med at se hvad jeg har gjort forkert??


For en ordens skyld, kan jeg fortælle at mine tabeller ser sådan ud:

Mine tabeller:

posts
  - forum_id
  - thread_id
  - post_id
  - post_message
  - post_datestamp

forums
  - forum_id
  - forum_cat
  - forum_access
  - forum_post
  - forum_lastpost

threads
  - thread_id
  - forum_id
  - thread_subject
  - thread_lastpostid
  - thread_lastpost
10. januar 2012 - 05:14 #1
Jeg forstår, at et forum kan have mange tråde.  Du skal, som du gør, joine tråde med forum ved tt.forum_id = tf.forum_id.

Jeg forstår yderligere, at en tråd kan have mange posts.  Du skal derfor joine posts med tråde ved tp.thread_id = tr.tread_id. 

Her er en 'nøgen' mysql forespørgsel, hvor du skulle undgå de problemer du nævnerÆ

SELECT tt.thread_id, tt.thread_subject, tp.post_message, tp.post_datestamp
FROM forums tf
JOIN threads tt ON tf.forum_id = tt.forum_id
JOIN posts tp ON tt.thread_id = tp.thread_id
WHERE tf.forum_id = 4
ORDER BY tp.post_datestamp ASC
LIMIT 5

To kommentarer:
I mysql opfattes JOIN som INNER JOIN.  (Hvis du vil have LEFT OUTER JOIN eller RIGHT OUTHER JOIN skriver du LEFT JOIN eller RIGHT JOIN. Lidt kortere.)

Du kan (og bør) i posts droppe feltetforum_id.  Det felt er unødvendigt og tjener til at forvirre.  Du ved hvilket forum en post tilhører indirekte ved at vide hvilken tråd den tilhører og hvilket forum tråden tilhører.
Avatar billede sokken Nybegynder
10. januar 2012 - 09:58 #2
Det virker perfekt. Det er bare super, og en rigtig god forklaring på det.

Mange tak for hjælpen.
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
Computerworld tilbyder specialiserede kurser i database-management

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