WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Plocka ut första och sista i mysql-tabell (https://www.wn.se/forum/showthread.php?t=20937)

Indigo 2007-04-29 18:21

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...

melin 2007-04-29 18:28

recordset.movefirst
recordset.movelast

tror jag det är du letar efter

Indigo 2007-04-29 18:36

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 2007-04-29 18:57

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

melin 2007-04-29 19:33

ok.. tips två: lagra det du hittar i en array, och plocka sen ut dina värden därifrån

eg0master 2007-04-29 21:02

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)


WizKid 2007-04-29 21:16

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.

eg0master 2007-04-29 22:18

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...

WizKid 2007-04-29 22:59

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.

Indigo 2007-04-30 01:13

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!


Alla tider är GMT +2. Klockan är nu 04:22.

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