Avatar billede Slettet bruger
06. juli 2009 - 06:28 Der er 6 kommentarer og
1 løsning

Udskrive titlen fra en anden tabel

Godmorgen folkens

Situationen er den at jeg i et "kommentarsvar" system udskriver de nyeste kommentarer, som er skrevet til den pågældende bruger. Kommentarerne bliver alle hentet fra den samme tabel, men tilhører forskellige "kategorier". I nedenstående udpluk har jeg blot taget 2 af disse kategorier - blogs og forum.

Det virker som det skal, men problemet er at jeg udskriver et udpluk af teksten, der er skrevet i kommentaren frem for at udskrive den reelle titel på bloggen/forummet. Eksempel følger:

Blog: men hvad synes du så om… (NY!)
Forum: hehe ja, det var godt nok… (NY!)
Forum: det ka vi hurtigt blive eni…
Blog: nej, hva da?
Forum: virker det mon?


Sådan ser det altså ud nu, men hvordan får jeg udskrevet titlen på bloggen og forummet i stedet for teksten på kommentaren? (mit eget bud må være noget union eller innerjoin, men kan ikke helt gennemskue hvordan og hvorledes det bliver gjort, da jeg ikke rigtig har arbejdet med det før)

Jeg har lige smidt et billede op med tabelstrukturen her: www.valuable.dk/tabelstruktur.jpg

Og her følger udplukket af min kode:

<?php
query = mysql_query("SELECT * FROM comments WHERE parentuserid = ".$_SESSION['SESS_MEMBER_ID']." ORDER BY time DESC LIMIT $s, $prside") or die(mysql_error());
$querytime = mysql_query("SELECT DATE_FORMAT(time, '%d.%m.%Y kl. %H:%i') as time FROM comments WHERE parentuserid = ".$_SESSION['SESS_MEMBER_ID']." ORDER BY time DESC") or die(mysql_error());
           
while ($row = mysql_fetch_assoc($query) AND $rowtime = mysql_fetch_assoc($querytime)) {

        echo '<div class="textblogtitle">';
       
        $message = nl2br(htmlspecialchars($row['text']));
        $message = str_replace("<br />","...", $message);   
               
        if(strlen($message)>50){
        $titel = substr($message,0,50);
        $ending = "...";
        }
        else{
        $titel = $message;
        $ending = "";
        }
       

        if($row['type'] == '1'){
        echo '<a href=blogs/';
        echo nl2br(htmlspecialchars($row['topic_id']));
        echo '/';
        echo nl2br(htmlspecialchars($row['id']));
        echo '#';
        echo nl2br(htmlspecialchars($row['id']));
        echo ' class="alternative">';
        echo 'Blog: ';
        echo $titel;
                echo $ending;
        echo '</a>';
            if ($row["seen"] == "0")
            {
            echo ' <font class="textnewcomment">NY</font>';
            }
        }
       
       
        if($row['type'] == '4'){
        echo '<a href=forum/kategori/';
        echo nl2br(htmlspecialchars($row['forum_id']));
        echo '/topic/';
        echo nl2br(htmlspecialchars($row['topic_id']));
        echo '/';
        echo nl2br(htmlspecialchars($row['id']));
        echo '#';
        echo nl2br(htmlspecialchars($row['id']));
        echo ' class="alternative">';
        echo 'Forum: ';
        echo $titel;
          echo $ending;
        echo '</a>';
            if ($row["seen"] == "0")
            {
            echo ' <font class="textnewcomment">NY</font>';
            }
        }
       
        echo '</div>';
        echo '<div class="textblogtime">';
        echo '<a href=profil/';
        echo nl2br(htmlspecialchars($row['userid']));
        echo ' class="alternative">';
        echo nl2br(htmlspecialchars($row['author']));
        echo '</a> (';
        echo $rowtime['time'];
        echo ')</div>';
        echo '<br />';

              }
       
      ?>
Avatar billede lakridserne Nybegynder
06. juli 2009 - 08:19 #1
Hvad med at lave en join hvor du sorterer på time på begge tabeller?
Avatar billede lakridserne Nybegynder
06. juli 2009 - 08:20 #2
Og altså kun tager titel og time med og udskriver titlen?
Avatar billede repox Seniormester
06. juli 2009 - 09:16 #3
Du bliver nød til at uddybe din tabelstruktur - måske er det bare fordi det er mandag morgen, men jeg er ikke sikker på jeg kan knytte dem rigtigt sammen.

Tabellen forum_topics har to felter som jeg ikke forstår tilknytningen til: topic_id og forum_id.
Hvilken af disse er den primære nøgle? Og i forhold til tabellen comments, hvilken af disse er så den relaterende nøgle?
For i comments har du også disse to felter - udover det du også har et parent_id; hvilken relation har det? Er det i relation til en tidligere kommentar?

Altså, lidt mere uddybning, så kan du få lidt bedre svar. Men ellers en rigtig fin idé med et screenshot af dine tabeller :)
Avatar billede Slettet bruger
06. juli 2009 - 10:13 #4
lakridserne:

Jeg har prøvet at lege lidt med join og fulgt det forslag du kom med, men synes desværre ikke helt jeg kan få det til at spille.. Den udskriver fint nok overskriften på blogs, men den udskriver slet ingen titel på forum og de andre kategorier - kan du lure hvorfor? Har igen plukket ud, så det kun er blogs + forum vi ser:

<?php               
$query = mysql_query("SELECT comments.id, comments.topic_id, comments.forum_id, comments.time, comments.author, comments.userid, comments.parentuserid, comments.seen, comments.type, blogs.title AS titleblog FROM comments, blogs WHERE comments.parentuserid = ".$_SESSION['SESS_MEMBER_ID']." AND blogs.blog_id = comments.topic_id

UNION

SELECT comments.id, comments.topic_id, comments.forum_id, comments.time, comments.author, comments.userid, comments.parentuserid, comments.seen, comments.type, forum_topics.title AS titleforum FROM comments, forum_topics WHERE comments.parentuserid = ".$_SESSION['SESS_MEMBER_ID']." AND forum_topics.topic_id = comments.topic_id

ORDER BY time DESC LIMIT $s, $prside") or die(mysql_error());
       
$querytime = mysql_query("SELECT DATE_FORMAT(time, '%d.%m.%Y kl. %H:%i') as time FROM comments WHERE parentuserid = ".$_SESSION['SESS_MEMBER_ID']." ORDER BY time DESC") or die(mysql_error());
       
while ($row = mysql_fetch_assoc($query) AND $rowtime = mysql_fetch_assoc($querytime)) {

    echo '<div class="textblogtitle">';
       
        $message = nl2br(htmlspecialchars($row['titleblog']));
    $message = str_replace("<br />","...", $message);   
               
        if(strlen($message)>50){
        $titel = substr($message,0,50);
        $ending = "...";
        }
        else{
        $titel = $message;
        $ending = "";
        }

        if($row['type'] == '1'){
        echo '<a href=blogs/';
        echo nl2br(htmlspecialchars($row['topic_id']));
        echo '/';
        echo nl2br(htmlspecialchars($row['id']));
        echo '#';
        echo nl2br(htmlspecialchars($row['id']));
        echo ' class="alternative">';
        echo 'Blog: ';
        echo $titel;
                echo $ending;
        echo '</a>';
            if ($row["seen"] == "0")
            {
                echo ' <font class="textnewcomment">NY</font>';
            }
        }

        $message4 = nl2br(htmlspecialchars($row['titleforum']));
    $message4 = str_replace("<br />","...", $message4);   
               
        if(strlen($message4)>50){
        $titel4 = substr($message4,0,50);
        $ending4 = "...";
        }
        else{
        $titel4 = $message4;
        $ending4 = "";
        }
       
        if($row['type'] == '4'){
        echo '<a href=forum/kategori/';
        echo nl2br(htmlspecialchars($row['forum_id']));
        echo '/topic/';
        echo nl2br(htmlspecialchars($row['topic_id']));
        echo '/';
        echo nl2br(htmlspecialchars($row['id']));
        echo '#';
        echo nl2br(htmlspecialchars($row['id']));
        echo ' class="alternative">';
        echo 'Forum: ';
        echo $titel4;
                echo $ending4;
        echo '</a>';
            if ($row["seen"] == "0")
            {
                echo ' <font class="textnewcomment">NY</font>';
            }
        }
       
        echo '</div>';
       
        echo '<div class="textblogtime">';
        echo '<a href=profil/';
        echo nl2br(htmlspecialchars($row['userid']));
        echo ' class="alternative">';
        echo nl2br(htmlspecialchars($row['author']));
        echo '</a> (';
        echo $rowtime['time'];
        echo ')</div>';

        echo '<br />';

        }
       
      ?>
Avatar billede Slettet bruger
06. juli 2009 - 10:31 #5
repox:
Helt i orden ;)

forum_topics har et felt ved navn forum_id til at definere hvilken overordnet kategori, som topic'et hører til. Dvs. forum_topics har en overordnet tabel ved navn forum. Feltet topic_id er forum_topics-tabellens primærnøgle.

Både feltet topic_id og forum_id er sådan set relaterende, mens parent_id definerer om den pågældende kommentar er et svar til en anden kommentar - så den havde du luret ;)

Håber det er til at forstå.. Ellers har jeg også selv givet mig eget "forslag" til noget join metode i forrige kommentar, som dog ikke virker efter hensigten. Men der kan man se hvilke relationer, der skal være - dvs:

blogs.blog_id = comments.topic_id

og

forum_topics.topic_id = comments.topic_id


Sådan mener jeg i hvert fald det skal være.. Har været oppe hele natten, så kan godt ske at jeg har overset noget eller set forkert pga. søvnmangel ;)
Avatar billede repox Seniormester
06. juli 2009 - 11:33 #6
Hmm... Jeg må sq indrømme at den eneste løsning jeg kan komme på er en kompleks SQL forespørgsel. Jeg er ikke hård nok til SQL til at kunne løse opgaven, men jeg vil foreslå dig at oprette spørgsmålet i MySQL kategorien under Databaser. Der sidder nogle som er virkelige hårde til det.
Avatar billede Slettet bruger
06. juli 2009 - 18:14 #7
Jeg har nu fået løst problemet vha. innerjoin metoder. Fik hjælp af en flink gut på #php.dk  (quakenet) ved navn pbro. Han vil ikke have points og jeg tager dem derfor blot tilbage (går jeg ud fra er okay)

For lige at give andre med samme problem en løsningsmetode brugte jeg følgende mysql query:

$query = mysql_query("

SELECT comments.*, blogs.title FROM comments
INNER JOIN blogs ON blogs.blog_id = comments.topic_id
WHERE comments.parentuserid = ".$_SESSION['SESS_MEMBER_ID']." AND comments.type = 1
       
UNION

SELECT comments.*, forum_topics.title FROM comments
INNER JOIN forum_topics ON comments.topic_id = forum_topics.topic_id
WHERE comments.parentuserid = ".$_SESSION['SESS_MEMBER_ID']." AND comments.type = 4
       
ORDER BY time DESC LIMIT $s, $prside") or die(mysql_error());
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