20. oktober 2010 - 12:42Der er
8 kommentarer og 1 løsning
Opbygning af query i PHP
Hej!
Det, jeg ønsker, er, at jeg vil lave en query, der tjekker om der er kommet nye indlæg siden man sidst besøgt et topic. De tre tabeller det drejer sig om og de relevante felter:
forum_topics -------------- id forum_id (= forummet id i tabellen over forummer) author_id (= brugerens id i den tabel der indeholder brugeroplysninger) date
forum_posts -------------- id topic_id (= forum_topics.id) author_id (= brugerens id som ovenfor) date
forum_topic_log -------------- id topic_id (= forum_topics.id) user_id (indeholder det samme som de ovenstående author_id) date
Hvis user_id = author_id bør de hedde det samme. Det andet er forvirrende.
Du mangler at forklare hvordan du vil have trukket det ud. Har du et forum_id hvor du så vil kunne vise en liste af topic's med en true/false om der er kommet nyt?
Eller vil du bare have en liste over alle indlæg man har læst, og se om der er kommet nyt i et eller flere af dem?
Jeg vil egentligt bare have en "true/false" værdi.. For jeg har lavet et udtræk af topics'ene tidligere, men hvis det kan flettes ind i den query ville det være bedre...
Jeg omdøber den lige til author_id !!
Query'en til at hente topics ser ud som flg. (den er meget simpel):
$foresp = mysql_query("SELECT * FROM forum_topics WHERE forum_id = '".mysql_real_escape_string($_GET['forum_id'])."' ORDER BY id DESC LIMIT ".$offset.", ".$limit);
Jeg var lidt hurtigt ude. Det er selvfølgelig en forskellig context du bruger dem i. En bruger er ikke nødvendigvis en author, så det vil også være forvirrende :)
Jeg ville tilføje et last_post felt til topics, så du altid ved hvornår det sidste indlæg er skrevet i et topic. Så slipper du for at skulle joine posts tabellen hver gang. Og så opdatere 'date' i forum_topic_log når de læser et nyt indlæg i topic'et (eller hver gang de bare læser topic'et, lidt nemmere at styre).
Du kan så prøve denne, se om den virker som den skal.
SELECT forum_topics.*, forum_topic_log.date AS newposts FROM forum_topics LEFT JOIN forum_topic_log ON (forum_topics.id=forum_topic_log.topic_id && forum_topics.date > forum_topic_log.date) WHERE forum_topics.forum_id = '".mysql_real_escape_string($_GET['forum_id'])."' ORDER BY forum_topics.id DESC LIMIT ".$offset.", ".$limit
Så bør du kunne tjekke om 'newposts' har en værdi. Men det er ikke testet, kan være det ikke virker.
Der var jeg lidt for hurtigt ude.. Hvis jeg grupperer på ovenstående felt vælger den ascending ordering af rows'ene..
Jeg opdaterer ikke bare datoen i tabellen, men indlægger en ny linje ved hvert besøg og derfor tror jeg der skal ændres en smule, men jeg kan simpelthen ikke få det til at fungere.
Ja, du bør ikke lægge en ny række ind hver gang. Hvis du kun har én række i forum_topic_log for hver bruger/topic kombination, bør du kunne lave kaldet uden brug af GROUP BY.
Nu virker det umiddelbart - kan jo være der kommer bugs senere, men det ser ud til at virke :P Tak for hjælpen.
Synes godt om
Ny brugerNybegynder
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.