Hvordan samler jeg både nye kommentarer og nye tråde fra mit forum?

Tags:    php

<< < 12 > >>
Goddag,

Jeg er i den situation at jeg, som overskriften indikerer, gerne vil have samlet både nye kommentarer og nye tråde i mit forum på min forside. Som det fungerer nu er det kun de nyeste kommentarer, der bliver samlet. Det gør jeg på denne måde:

Fold kodeboks ind/udKode 


Det kan ses her http://www.udeboende.dk/ , hvordan de 7 nyeste kommentarer bliver udskrevet fra forummet på forsiden (lidt ned og i venstre side)


Men hvordan knytter jeg foruden nye kommentarer de nye tråde til SQL forespørgslen også?

Skitseret er det sådan her det skal se ud:

1. Topic titel (linker fx til forum/kategori/7/topic/23#124 <- dvs en kommentar)
2. Topic titel (linker fx til forum/kategori/15/topic/14#37 <- dvs en kommentar)
3. Topic titel (linker fx til forum/kategori/15/topic/14 <- dvs en tråd)
4. Topic titel (linker fx til forum/kategori/6/topic/11#12 <- dvs en kommentar)
5. Topic titel (linker fx til forum/kategori/15/topic/18 <- dvs en tråd)
6. Topic titel (linker fx til forum/kategori/10/topic/14 <- dvs en tråd)
7. Topic titel (linker fx til forum/kategori/16/topic/121#8 <- dvs en kommentar)


Så vidt jeg kan se skal jeg ind og benytte mig af UNION, men kan ikke helt overskue hvordan jeg får det gjort på den rigtige måde, samt hvordan jeg skelner mellem om det er en tråd eller kommentar (da stien skal være forskellig til disse to)

Håber meget at en venlig sjæl kan hjælpe til ;)



14 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Det ligner det jeg skrev men er det ikke.

Mit i teorien laver en tabel med den første kommentar for alle tråde og laver en join af den tabel og tråd tabellen med en limit på 7 sorterere DESC på date i den virtuelle tabel. Det sidste har jeg skrevet som ASC og det en fejl :).

SELECT t.* FROM tråde AS t,(SELECT trådid,data FROM kommentarer GROUP BY trådid ORDER BY date ASC) as k,WHERE t.trådid=k.trådid ORDER BY k.date DESC LIMIT 7

Fold kodeboks ind/udKode 


I teorien har ikke testet dem, men det nok lettest hvis du først skriver den inderste select og får de rigtige kommentarer i den, og der efter skriver den yderst select der joiner dine to tabeller.



Hvis du gemmer den date en tråd bliver oprettet på før hver tråd ville det være

SELECT * FROM tråd ORDER BY date DESC LIMIT 7

Hvis du ikke har det men bare datoen på en kommentarerne er det noget i retning af:

SELECT t.* FROM tråde AS t,(SELECT trådid,data FROM kommentarer GROUP BY trådid ORDER BY k.date ASC) as k,WHERE t.trådid=k.trådid ORDER BY k.date ASC LIMIT 7

Forbehold for fejl i den ovenstående SQL :) og der er sikker en lettere måde at finde det rigtige svar :)



Altså jeg har jo allerede det nederste som du skriver i mit kode-eksempel:

$query = mysql_query("SELECT com.id, 4 as type, ft.forum_id, ft.title, com.topic_id FROM (SELECT max(id) as id, topic_id FROM comments where type = 4 group by topic_id ORDER BY id DESC LIMIT 7) com INNER JOIN forum_topics ft using(topic_id)") or die(mysql_error());

Og det er rigtig nok hvad du skriver med dataen fra tråden.. Spørgsmålet er bare hvordan jeg får den koblet sammen (vha. union) med ovenstående kode :)



Oh okay, så misforstod jeg dig ;)

Nu har jeg min SELECT streng til at udskrive topics, hvor der for nyligt er blevet kommenteret i vha. denne:

Fold kodeboks ind/udKode 


Og så har jeg min anden SELECT streng, hvor jeg udskriver de nyeste oprettede topics

Fold kodeboks ind/udKode 



Men hvordan får jeg så dem koblet sammen, hvor der er en fælles limit på 7 og de sorteres ud fra "time" ? :)


Har prøvet mig lidt frem med denne kombination, men desværre uden held:

Fold kodeboks ind/udKode 




Har selv fået løst det nu, i hvert fald størstedelen af det. Det ser ud som følgende:

Fold kodeboks ind/udKode 


Den udskriver de rigtige ting fra både topics og kommentarer nu. Der er dog to lille problemer ved det..

Hvis der er et nyligt oprettet topic bliver det lagt i listen. Men hvis der er en nylig oprettet kommentar bliver den også lagt i listen. Dvs. der ligger to "links" til det topic (et til selve topic og et til selve kommentaren). Hvordan får jeg gjort sådan at de to overskriver hinanden, så der kun er én i listen - vel og mærket den nyeste af de to?

Det andet problem er at den ikke sortere helt korrekt efter datoen på oprettelse af hhv. kommentar og topic. Det ser ud til at den bare smider dem rimelig tilfældigt ud :S



Du kan se hvordan den smider dem ud her:

http://www.persjensen.dk/pt.jpg



synes efter hånden det rimeligt mystisk hvad du laver, men hvad med bare at lægge din union i en select sådan her?

SELECT * FROM (SELECT com.id, 4 as type, ft.forum_id, ft.title, com.topic_id, time FROM (SELECT max(id) as id, topic_id FROM comments where type = 4 group by topic_id) com INNER JOIN forum_topics ft using(topic_id) UNION SELECT 0, text, forum_id, title, topic_id, time FROM forum_topics ORDER BY time DESC LIMIT 7) GROUP BY topic_id




Jeg kombinerer SQL strengen (der henter kommentarerne og de tilhørende forum titler/id/kategorier) med SQL strengen (der henter topics).. Sådan som jeg troede du ville have mig til :S

Men hvis jeg prøver den du skrev der får jeg følgende fejl:

Every derived table must have its own alias



Fik researchet lidt på google og er nu kommet frem til følgende:

SELECT * FROM (SELECT com.id, 4 as type, ft.forum_id, ft.title, com.topic_id, time FROM (SELECT max(id) as id, topic_id FROM comments where type = 4 group by topic_id) com INNER JOIN forum_topics ft using(topic_id) UNION SELECT 0, text, forum_id, title, topic_id, time FROM forum_topics LIMIT 7) as ownalias GROUP BY topic_id ORDER BY time DESC

Eneste problem for at få det til at virke fuldent nu er at når den udskriver en kommentar i listen. Så er den rangeret efter det tidspunkt "time" som topic er oprettet på og ikke efter det tidspunkt som kommentaren er skrevet. Kan du umiddelbart se en smart løsning på det også ;)?



Det er måske ikke lige sådan til?

Ellers må du bare skrive.. Så får du points og jeg takker for hjælpen so far ;)



<< < 12 > >>
t