FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Flitig postare
|
SELECT * FROM forum_threads WHERE forum = '{$forum_id}' ORDER BY date DESC
Sådär ser min query ut när jag hämtar alla trådar när jag är i ett forum. Just nu sorterar jag dem på när de lades ut. Men den skall också kunna sortera när senaste inlägget i trådarna gjordes. Så den skall alltså sortera genom både trådens och inlägges tid samtidigt för att få allt rätt sorterat. Vill gärna ha hjälp med detta för jag har sökt mycket men inte hittat något vettigt. |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Klarade millennium-buggen
|
Kod:
SELECT forum_posts.*, forum_threads.* FROM forum_posts, forum_threads WHERE forum_threads.id=forum_posts.parent AND forum_threads.id=$id ORDER BY forum_posts.postdate DESC Dessutom bör du inte spotta in den variabeln rakt av utan jag skulle snarare göra denna varianten, om du inte använder ett språk med prepared statements samt kontrollerar all din data. PHP-kod:
|
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Flitig postare
|
Det funkar inte eftersom när man gör trådar så läggs inget in i forum_posts och den där queryn sorterar bara efter datum på inlägg.
Om man gör en ny tråd ska den hamna högst upp även om man inte har några inlägg. |
||
![]() |
![]() |
![]() |
#4 | |||
|
||||
Mycket flitig postare
|
Jag rekommenderar att i forum_threads har du enbart titel, skapare, skapad, id och så. Under forum_posts ska även det första inlägget vara.
|
|||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Flitig postare
|
då måste ju forum_posts ha en kolumn som hänvisar till raden i forum_threads.
och om man bara har gjort ett vanligt inlägg, skall den kolumnen vara = 0 då? |
||
![]() |
![]() |
![]() |
#6 | |||
|
||||
Flitig postare
|
Du får göra en outer join så tar den med rader som inte har någon forumpost kopplad
|
|||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Flitig postare
|
Satt o leta på Google och hittade denna:
SELECT thread_id, MAX(date) AS MaxPostTime FROM forum_posts GROUP BY thread_id ORDER BY MaxPostTime DESC LIMIT 10 Är denna optimal? Alltså den kollar ju vilken tidstämpel som är den högsta och sorterat därefter. Det funkar bra och så men är det så man ska göra eller finns det bättre sätt? Kan man typ göra såhär då: SELECT *, MAX(date) AS MaxPostTime FROM ... Så man får med alla kolumner men ändå sorterar? |
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Flitig postare
|
Här kommer en liten uppdatering:
SELECT forum_threads.*, forum_posts.date FROM forum_posts, forum_threads WHERE forum_threads.forum = '{$forum_id}' GROUP BY forum_threads.id ORDER BY forum_posts.date DESC Det är min nuvarande query. Här ser ni problemet: http://fuskbugg.se/dl/nYLmnh |
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Medlem
|
Enklaste är ju att göra en till kolumn för forum_threads som heter något i stil med "latest_post_date" och när någon gör ett inlägg i en tråd så är det bara att köra en UPDATE `forum_threads` SET `latest_post_date`= nuvarande datum WHERE `thread_id` = tråden inlägget gjordes i"
Så är det ju sen bara att sortera efter latest_post_date sen, då behöver du inga joins, ingen GROUP BY, ingen tung query alls. Visst kan det kännas onödigt att göra en update varje gång någon skriver ett inlägg men i förhållande till dom vägarna du försöker gå nu så det absolut inga som helt problem. EDIT: Ojsan, denna tråden var visst flera veckor gamla, var ju nästan längst upp på första sidan så antog att den var ganska färsk, skrivs det så lite i "Serversidans teknologier" :S Senast redigerad av JesperA den 2012-09-15 klockan 21:58 |
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Klarade millennium-buggen
|
|||
![]() |
![]() |
Svara |
|
|