Kom ihåg mig?
Home Menu

Menu


Plocka ut första och sista i mysql-tabell

 
Ämnesverktyg Visningsalternativ
Oläst 2007-04-29, 18:21 #1
Indigo Indigo är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2007
Inlägg: 305
Indigo Indigo är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2007
Inlägg: 305
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...
Indigo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-04-29, 18:28 #2
melin melin är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2003
Inlägg: 1 396
melin melin är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2003
Inlägg: 1 396
recordset.movefirst
recordset.movelast

tror jag det är du letar efter
melin är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-04-29, 18:36 #3
Indigo Indigo är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2007
Inlägg: 305
Indigo Indigo är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2007
Inlägg: 305
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
Indigo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-04-29, 18:57 #4
Indigo Indigo är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2007
Inlägg: 305
Indigo Indigo är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2007
Inlägg: 305
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
Indigo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-04-29, 19:33 #5
melin melin är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2003
Inlägg: 1 396
melin melin är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2003
Inlägg: 1 396
ok.. tips två: lagra det du hittar i en array, och plocka sen ut dina värden därifrån
melin är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-04-29, 21:02 #6
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
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)
eg0master är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-04-29, 21:16 #7
WizKid WizKid är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2004
Inlägg: 618
WizKid WizKid är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2004
Inlägg: 618
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.
WizKid är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-04-29, 22:18 #8
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
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...
eg0master är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-04-29, 22:59 #9
WizKid WizKid är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2004
Inlägg: 618
WizKid WizKid är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2004
Inlägg: 618
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.
WizKid är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-04-30, 01:13 #10
Indigo Indigo är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2007
Inlägg: 305
Indigo Indigo är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2007
Inlägg: 305
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";
Jag inser att jag behöver ha fram users.username för både first.author och last.author, men jag vet inte hur. Jag lyckas heller inte få fram ANTALET posts som finns grupperad i varje t_id. Att köra en så enkel sak som COUNT(first.t_id) ger helskumma resultat.

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
Jag inser att jag missar något, men jag vet inte vad :/
Någon expert som kan leda mig på rätt väg?

Tack för all hjälp hittills!
Indigo är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 23:51.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017