Avatar billede Slettet bruger
25. juni 2009 - 03:34 Der er 6 kommentarer og
1 løsning

Kombinere indhold fra flere tabeller?

Hola folkens..

Jeg sidder og arbejder på et lille forumsvar/indbakke system, hvor jeg gerne skal have inputs fra flere tabeller i databasen - men hvordan gør jeg det?

Som min side ser ud nu henter jeg "ulæste" kommentarer fra blogs i min indbakke, men jeg vil ligeledes gerne have den til at hente "ulæste" kommentarer fra mit forum også. Indbakken skal derfor gerne være en blanding af "ulæste" kommentarer fra både blogs og forum. Jeg kan illustrere det på med nedenstående opbygning:

Nyeste forumsvar
Hvordan gør jeg dette? (skrevet af xxx, d. xxx)
Student anno 2009 - hvor mange er blevet det? (skrevet af xxx, d. xxx)
Blog: Mine karakterer (skrevet af xxx, d. xxx)
Hvad er jeres yndlingsslik? (skrevet af xxx, d. xxx)
Blog: Turen går til Spanien (skrevet af xxx, d. xxx)



Måden hvorpå jeg henter de "ulæste" kommentarer fra blogs i min indbakke er som følgende:

<?php               
$query = mysql_query("SELECT * FROM blogs_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 blogs_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']));
           
        if(strlen($message)>60){
        $titel = substr($message,0,60);
        $ending = "...";
        }
        else{
        $titel = $message;
        $ending = "";
        }
       

if ($row["seen"] == "0")
{
echo '<b>';
echo '<a href=blogs.display.php?id=';
echo nl2br(htmlspecialchars($row['blog_id']));
echo '&read=';
echo nl2br(htmlspecialchars($row['id']));
echo '#';
echo nl2br(htmlspecialchars($row['id']));
echo ' class="alternative">';
echo $titel;
echo $ending;
echo '</a>';
echo '</b>';
}
       
else if ($row["seen"] == "1")
{
echo '<a href=blogs.display.php?id=';
echo nl2br(htmlspecialchars($row['blog_id']));
echo '#';
echo nl2br(htmlspecialchars($row['id']));
echo ' class="alternative">';
echo $titel;
echo $ending;
echo '</a>';
}
       
echo '</div>';       
echo '<div class="textblogtime">';
echo '<a href=profil.php?id=';
echo nl2br(htmlspecialchars($row['userid']));
echo ' class="alternative">';
echo nl2br(htmlspecialchars($row['author']));
echo '</a> (';
echo $rowtime['time'];
echo ')</div>';
echo '<br />';

}
       
?>


Jeg kunne naturligvis løse det på en lettere måde ved at adskille forumsvar og blogsvar, men vil foretrække at de bliver flettet sammen af forskellige årsager ;) Håber det kan lade sig..
Avatar billede Slettet bruger
25. juni 2009 - 03:37 #1
Hov, kom lige i tanke om at jeg havde et bonus spørgsmål som dog ikke er et must at få svar på ;) Men vil selvfølgelig stadig sætte pris på det..!

Som det ser ud nu henter jeg det første af kommentaren som titel i indbakken. Er der en måde hvorpå jeg kan hente "overskriften" på den blog eller det topic, som den pågældende kommentar hører til i stedet?
Avatar billede tofferman Nybegynder
25. juni 2009 - 08:24 #2
Svaret på dit første spørgsmål:

Løsning 1:
Lav to SQL-sætninger som du binder sammen med UNION. De to sql-sætninger skal have samme antal kolonner.

Løsning 2:
Lav en tabel som du bruger til midlertidige data. Du kører en INSERT med data fra hhv. den ene tabel og den anden, og derefter laver du en SELECT-sætning som trækker dataene fra den midlertidige tabel.

Når du indsætter data i den midlertidige tabel kan du eventuelt også indsætte session-id, så du kan køre en sletteforespørgsel med det som kriterie når siden er indlæst.
Avatar billede tofferman Nybegynder
25. juni 2009 - 08:25 #3
Til dit bonusspørgsmål bliver vi nok lige nødt til at se hvordan din tabelstruktur er.
Avatar billede Slettet bruger
25. juni 2009 - 12:43 #4
Jeg syntes det var lidt for kringlet så jeg valgte i stedet at adskille forumsvar og blogsvar og dele det op på siden.. Men jeg brugte dog din union metode til at tælle antal ulæste beskeder fra begge tabeller - så tak for det ;)

Mht. bonusspørgsmålet:
I mine kommentartabel er der information om hhv. hvilket blog_id og hvilket forum_id kommentaren tilhører.

Jeg tænkte derfor at det måske kunne være muligt at sige at den skulle hente titlen fra hhv. blogs og topics, hvor id var blog_id og forum_id - hvis du forstår mig :) ?
Avatar billede tofferman Nybegynder
25. juni 2009 - 13:28 #5
Jamen, det kan du jo godt. Så er det jo bare at lave en separat sql-sætning, som søger efter blog_id eller forum_id i den tabel der indeholder overskrifterne.
Avatar billede Slettet bruger
25. juni 2009 - 14:30 #6
Det synes jeg også bare at jeg har prøvet, men uden held :/

Kan du give mig et hint om hvordan det skal se ud i mit tilfælde?
Avatar billede Slettet bruger
26. juni 2009 - 17:11 #7
Prøvede desuden at løse det oprindelige problem vha. af UNION metoden som du foreslog, men kan heller ikke få det til at fungere efter hensigten :/

Har prøvet med følgende uden held:

      <?php               
        $query = mysql_query("SELECT topic_id, id, userid, author, text, time, seen, parentuserid FROM forum_comments WHERE parentuserid = ".$_SESSION['SESS_MEMBER_ID']." UNION SELECT blog_id, id, userid, author, text, time, seen, parentuserid FROM blogs_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 forum_comments WHERE parentuserid = ".$_SESSION['SESS_MEMBER_ID']." UNION SELECT DATE_FORMAT(time, '%d.%m.%Y kl. %H:%i') as time FROM blogs_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']));
           
        if(strlen($message)>60){
        $titel = substr($message,0,60);
        $ending = "...";
        }
        else{
        $titel = $message;
        $ending = "";
        }
       
        if ($row["seen"] == "0")
        {
            echo '<a href=forum.display.php?id=';
            echo nl2br(htmlspecialchars($row['topic_id']));
            echo '&read=';
            echo nl2br(htmlspecialchars($row['id']));
            echo '#';
            echo nl2br(htmlspecialchars($row['id']));
            echo ' class="alternative">';
            echo $titel;
            echo $ending;
            echo '</a>';
            echo ' <font class="textnewcomment">NY</font>';
        }
       
        else if ($row["seen"] == "1")
        {
            echo '<a href=forum.display.php?id=';
            echo nl2br(htmlspecialchars($row['topic_id']));
            echo '#';
            echo nl2br(htmlspecialchars($row['id']));
            echo ' class="alternative">';
            echo $titel;
            echo $ending;
            echo '</a>';
        }
       
        echo '</div>';
       
        echo '<div class="textblogtime">';
        echo '<a href=profil.php?id=';
        echo nl2br(htmlspecialchars($row['userid']));
        echo ' class="alternative">';
        echo nl2br(htmlspecialchars($row['author']));
        echo '</a> (';
        echo $rowtime['time'];
        echo ')</div>';

        echo '<br />';

        }
       
      ?>


Selv hvis ovenstående kom til at virke ville der opstå et yderligere problem i og med linket til hvert svar ikke skal være "forum.display....." men "blog.display....." når det er hentet ud fra blogs_comments databasen :S
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