Avatar billede sokken Nybegynder
08. januar 2012 - 20:32 Der er 11 kommentarer og
1 løsning

Select fra 3 forskellige tabeller i samme database

Jeg skal have trukket data ud fra 3 tabeller, men i samme database.

Tabeller: forum - posts - thread

Den henter fint nok fra post_message, men viser det 2 gange.
Jeg vil også gerne have indholdet med fra thread_subject (som er overskriften)

Kan nogen fortælle mig, hvad jeg har gjort forkert, og hvordan jeg får det lavet korrekt?

Det ser sådan ud lige nu:

$result = dbquery("
    SELECT tt.forum_id, tt.thread_id, tp.post_message, tp.post_datestamp, tt.thread_subject FROM ".DB_POSTS." tp, ".DB_THREADS." tt
    INNER JOIN ".DB_FORUMS." tf ON tt.forum_id=tf.forum_id

    WHERE ".groupaccess('forum_access')." AND tp.forum_id='4' ORDER BY post_datestamp DESC LIMIT 5
");
if (dbrows($result)) {
    while($data = dbarray($result)) {
        $itemsubject = trimlink($data['thread_subject'], 30);
        $itemsubject = trimlink($data['post_message'], 250);
        echo THEME_BULLET." <a href='".FORUM."viewthread.php?thread_id=".$data['thread_id']."' title='".$data['thread_subject']."' class='side'>$itemsubject</a><br /><br /><hr /><br />\n";
Avatar billede jesperhgh Nybegynder
08. januar 2012 - 20:48 #1
Kan du fortælle os, hvad du vil have ud af de tre tabeller.
Det er lidt svært at fortælle, hvad du gør forkert, når vi ikke ved, hvad skulle have været rigtigt :o)
Avatar billede sokken Nybegynder
08. januar 2012 - 20:51 #2
Jeg vil gerne have en list med indlæg. Altså
Overskrift.
Forum-indhold-tekst.

Det kan ses på siden her - hvor der lige nu er 2 tekster, men vises som 4 fordi de gentages.

Nedenunder er listen med kun overskrifterne.

Men overskrifterne skal altså vises over selve indholdsteksten.

http://majo.dk/Nisse/news.php
Avatar billede jesperhgh Nybegynder
08. januar 2012 - 21:06 #3
Ja, jeg ser at der er dubletter. Men du må forklare lidt mere om din tabelopbygning. Hvad er (og skal referes til) i forskellige tabeller?

Kan du ikke i plain dansk fortælle om de tre tabeller, og hvad du ønsker trukket ud herfra?
Avatar billede sokken Nybegynder
08. januar 2012 - 21:28 #4
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

Som du kan se i min kode, vil jeg have de sidste 5 threads med forum_id=4 trukket ud, men seneste indlæg øverst.
De skal indeholde thread_subject (som er overskriften på hvert enkelt indlæg) samt post_message (som er selve indlæggene). Jeg har sat en Limit på 250 tegn på post_message.
Avatar billede jesperhgh Nybegynder
08. januar 2012 - 22:54 #5
Fedt, men hvilke ønsker du så sammen efter .
og i hvilke konstaletioner.
Avatar billede sokken Nybegynder
08. januar 2012 - 23:00 #6
Hmm det eneste jeg rent faktisk mangler, er at få sat en overskrift ind på hvert enkelt indlæg. Dvs at jeg blot mangler hjælp til at få flettet threads_subject fra tabellen threads med ind i den kode som allerede virker.

$result = dbquery("
    SELECT tp.forum_id, tp.thread_id, tp.post_message, tp.post_datestamp FROM ".DB_POSTS." tp
    INNER JOIN ".DB_FORUMS." tf ON tp.forum_id=tf.forum_id

    WHERE ".groupaccess('forum_access')." AND tp.forum_id='4' ORDER BY post_datestamp DESC LIMIT 5
");
if (dbrows($result)) {
    while($data = dbarray($result)) {
        $itemsubject = trimlink($data['thread_subject'], 30);
        $itemsubject = trimlink($data['post_message'], 250);
        echo THEME_BULLET." <a href='".FORUM."viewthread.php?thread_id=".$data['thread_id']."' title='".$data['thread_subject']."' class='side'>$itemsubject</a><br /><br /><hr /><br />\n";
    }
Avatar billede jesperhgh Nybegynder
09. januar 2012 - 06:33 #7
husk, at du kan lave denne:

select * from (select * from) as subq //navn påkrævet!

ALTSÅ:
er der nogen, du rigtig gerne vil have med, så:
select * from mytabel where ilike=ja

derefter kan du sætte den ovenstående i parentes og give den et navn, så er det et subquery:

(select * from mytabel where ilike=ja) as blah //selvom du ikke bruger navnet.

så kan du:
select navn from (select * from mytabel where ilike=ja) as blah;

..Altså, at du kan neste dine forespørgsler.
..simpelthen lave en forespørgsel ind i en forespørgsel..

Hvor effektivt dét så er, afhænger af din indexering.

jeg er ikke den store pædagog, men jeg håber du forstår mig.
Avatar billede sokken Nybegynder
09. januar 2012 - 16:52 #8
Ved at prøve mig frem, har jeg fået det til at virke - bortset fra, at gentager, så det vises 2 gange.

Koden ser sådan her ud nu:

$result = dbquery("
SELECT tt.thread_subject, tp.post_message 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 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'>$itemsubject<br />$itemmessage</a><br /><br /><hr /><br />\n";
    }
}
Avatar billede sokken Nybegynder
09. januar 2012 - 18:00 #9
Det er min limit der er noget galt med. Den viser ganske rigtigt 5, men starter så forfra igen.
Avatar billede sokken Nybegynder
09. januar 2012 - 19:02 #10
Hov nej der er sørme da mere galt. Sorterer jeg ASC passer thread_subject og post_message fint sammen, men sorterer jeg DESC reagerer thread_subject ikke på det, den fortsætter med at være i den anden række følge.

Så der er vist noget rod i min kode. Jeg håber der er nogen, der lige kan hjælpe mig i den rigtige retning igen.
Avatar billede sokken Nybegynder
09. januar 2012 - 22:08 #11
jesperhgh smid et svar, så får du point for din hjælp.

Jeg opretter en ny tråd med næste problem,synes det er ved at blive for rodet ofr mig nu :)
Avatar billede jesperhgh Nybegynder
10. januar 2012 - 11:08 #12
OK, tak.
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