FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Flitig postare
|
Sprang på ett litet klurigt problem.
Jag har en tabell som innehåller fälten author, thread_id och posttime (plus några fler som inte är viktiga nu). Det jag nu vill hämta ut är följande: Vem som skrev det första meddelandet i respektive thread_id, vem som skrev det sista meddelandet i respektive thread_id, samt när det sista skrevs. Genom att köra en GROUP BY thread_id får jag ju ut alla olika trådar för sig. Om jag dessutom plockar ut MAX(posttime) får jag ut senaste postar-tiden. Eftersom jag har en ORDER BY posttime så kan jag även på så sätt plocka ut namnet på sista som postade - frågan är bara hur jag gör för att plocka ut den första som postade? Funkar det med MIN(author) eller betyder det att jag får den som kommer först eller sist i alfabetsordning? Hmmm, lyckas jag ens beskriva mitt problem? Får nästan lite "Bullen"-flashbacks... |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Har WN som tidsfördriv
|
recordset.movefirst
recordset.movelast tror jag det är du letar efter |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Flitig postare
|
Nu lyckades jag få till det.... det kanske inte är vackert, men det funkar:
$strsql = "SELECT id,t_id,topic,MAX(postime),MIN(username),COUNT(id) ,MAX(username) FROM ".TBL_POSTS." LEFT JOIN ".TBL_USERS. " ON ".TBL_POSTS.".author=".TBL_USERS.".userid GROUP BY t_id ORDER BY postime DESC"; ska kolla upp det du föreslog melin. Tackar ![]() |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Flitig postare
|
Verkar som jag ropade hej för tidigt. MAX och MIN funkar INTE.
Attans. Kanske ska precisera att jag kör PHP & MySQL, version 5.x |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Har WN som tidsfördriv
|
ok.. tips två: lagra det du hittar i en array, och plocka sen ut dina värden därifrån
|
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Mycket flitig postare
|
Det är väl idiotiskt att hämta allt data och lägga det i en array (motsv) för att hitta första och sista posten. Databaser är ju skapta för att söka och hämta information. Använd dem till det och gör inte jobbet själv utanfördatabasen!
Nu när mysql börjat stödja subqueries så blir det en enkel sak. Och jag antar att ID kolumnen är en inkrementell nyckel så det är lätt att hitta första (min(id)) och sista (max(id)) posten. Kod:
SELECT first.username, last.username FROM posts AS first, posts AS last WHERE first.topic = last.topic AND first.id IN (SELECT MIN(id) FROM posts WHERE topic = first.topic) AND last.id IN (SELECT MAX(id) FROM posts WHERE topic = last.topic) |
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Mycket flitig postare
|
Borde inte den frågan bli ruskigt seg? Eftersom för varje topic ska det göras två till frågor. MySQL kanske optimerar det men det känns inte speciellt optimalt.
|
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Mycket flitig postare
|
Tja, ska man välja ut alla topixcs så visst blir det "segt" med subselects, men MAX resp MIN på en kollumn som det sannolikt finns index för är ju inte hela världen. Och jag skulle hellre göra det i databasen än i min kod utanför databasen... Någonstans måste det ju göras...
|
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Mycket flitig postare
|
Tänkte mest på att man kanske skulle fundera på att ändra om i databasstrukturen. Tror den du skrivit är så snabb som den kan bli med denna struktur.
|
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Flitig postare
|
Har suttit och pillat och pillat, men jag får inte till det.
Mitt anrop ser ut enligt följande: Kod:
SELECT MAX(first.postime),first.author,last.author,username,first.t_id,MAX(last.topic) FROM posts AS first, posts AS last LEFT JOIN users ON author=users.userid WHERE first.t_id=last.t_id AND first.id IN (SELECT MIN(first.id) FROM posts WHERE last.t_id=first.t_id) AND last.id IN (SELECT MAX(last.id) FROM posts WHERE first.t_id=last.t_id) GROUP BY first.t_id ORDER BY first.postime DESC"; I mina tabeller har jag följande: Kod:
posts: id = bigint (auto_increment) t_id = bigint <---- detta är tråd-id topic = varchar content = text author = bigint postime = int Kod:
users: userid = bigint (auto_increment) username = varchar Någon expert som kan leda mig på rätt väg? Tack för all hjälp hittills! |
||
![]() |
![]() |
Svara |
|
|