![]() |
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... |
recordset.movefirst
recordset.movelast tror jag det är du letar efter |
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 :) |
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 |
ok.. tips två: lagra det du hittar i en array, och plocka sen ut dina värden därifrån
|
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 |
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.
|
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...
|
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.
|
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) I mina tabeller har jag följande: Kod:
posts: Kod:
users: Någon expert som kan leda mig på rätt väg? Tack för all hjälp hittills! |
MAX i selectdelen känns ju onödigt eftersom du bara kommer bara väljer ut en relevant rad från "first" respektive "last". Dock är ju count ett problem (som även det kan lösas med en subselect).
För att få ut rätt användarnamn måste du joina med users tabellen två gånger, en för "first" och en för "last". |
Det är just den joinen som inte lyckas. Jag får felmeddelande i stil med att jag redan joinat den tabellen och inte kan göra det igen. Hmmm, kan det vara så att jag måste göra det i en subselect?
|
Antagligen för att du gör en left join i from delen istället för att göra en implicit join på samma sätt som jag gjorde med mitt exempel med posts.
Kod:
SELECT whatever |
MAX(id) kommer ju garanterat välja den sista posten. Kolla mot post-datumet istället.
Sen så är det betydligt effektivare att köra "tre" frågor än att hämta hela resultat-settet. |
Alla tider är GMT +2. Klockan är nu 18:24. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson