---
title: "Endast ett inlägg/en tråd skall redovisas"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/118203-endast-ett-inlägg-en-tråd-skall-redovisas"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "ampy"
published: "2004-12-17T00:05:41.000Z"
updated: "2004-12-20T19:57:54.000Z"
replies: 4
views: 280
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/118203-endast-ett-inlägg-en-tråd-skall-redovisas"
---

# Endast ett inlägg/en tråd skall redovisas

## #1 — ampy, 2004-12-17T00:05Z

Har denna sql-fråga:

```
SELECT 
	ft.threadID, 
	ft.subject, 
	ft.userid, 
	m1.usr, 
	ft.room, 
	ft.last_post, 
	ft.readers, 
	ft.answers, 
	ft.smiley, 
	fp.id, 
	fp.userid, 
	fp.datum, 
	m2.usr, 
	ft.poll, 
	ft.locked 
FROM
	forum_topics ft 
	inner join forum_posts fp on fp.threadID = ft.threadID 
	inner join members m1 on ft.userid = m1.id 
	inner join members m2 on m2.id = fp.userid 
WHERE 
	fp.userid = 1 
ORDER BY
	ft.room asc, ft.last_post desc limit 0,20
```

**Problem 1**
Frågan är en del av en söktjänst till ett forum. Vad frågan ovan gör är att den "söker" igenom alla inlägg som är skrivna av användaren som har ID-nummer 1 (se WHERE-klausulen).

Problemet är det att användaren i fråga kan ha skrivit fler än ett inlägg i en tråd. Om så är fallet kommer utskriften att resultera i att en tråd skrivs ut flera gånger (det antalet gånger användaren har skrivit i tråden).

Jag har provat med att sätta distinct på ft.threadID med det hjälpte inte.

**Problem 2**
För tillfället har jag ännu en sql-fråga i självaste iteratorn som hämtar det senaste inlägget i aktuell tråd. Det är inget vidare att ha en sql-fråga i en iterator (loop) så därför vill jag inkludera denna fråga i huvudfrågan. 
Därför måste huvudfrågan formuleras sådan att den, tillsammans med tråden, hämtar det senaste inlägget i tråden (fp.id desc).

Har testat med att lägga till HAVING-klausulen:

```
having ft.last_post = max(fp.datum)
```

Men detta resulterade i noll träffar/trådar, antagligen för att användaren i fråga inte har skrivit det senaste inlägget.

Är det någon som kan fundera på hur denna 'stora' sql-fråga skall formuleras?

Tacksam för svar.

Permalänk: https://www.webforum.nu/p/118203

## #2 — LarsG, 2004-12-17T10:40Z

```
SELECT 
	ft.threadID, 
	ft.subject, 
	ft.userid, 
	m1.usr, 
	ft.room, 
	ft.last_post, 
	ft.readers, 
	ft.answers, 
	ft.smiley, 
	fp.id, 
	fp.userid, 
	fp.datum, 
	m2.usr, 
	ft.poll, 
	ft.locked 
FROM
	forum_topics ft 
	inner join forum_posts fp on fp.threadID = ft.threadID 
	inner join members m1 on ft.userid = m1.id 
	inner join members m2 on m2.id = fp.userid 
        inner join forum_posts fp2 on fp2.threadID = ft.threadID 
WHERE 
	fp.userid = 1 
        group by ft.threadID, 
	ft.subject, 
	ft.userid, 
	m1.usr, 
	ft.room, 
	ft.last_post, 
	ft.readers, 
	ft.answers, 
	ft.smiley, 
	fp.id, 
	fp.userid, 
	fp.datum, 
	m2.usr, 
	ft.poll, 
	ft.locked 
having fp.datum = min(fp2.datum)
ORDER BY
	ft.room asc, ft.last_post desc limit 0,20
```

Samma teknik på fråga 2.

Permalänk: https://www.webforum.nu/p/1508356

## #3 — ampy, 2004-12-17T15:21Z

SQL-frågan fungerar som jag hade tänkt, men den är otroligt seg när det handlar om många poster. 

T.ex. när man söker på användar-id 1:s inlägg, låt oss kalla 1 för Uffe, får man 650 träffar/trådar. 

Uffe har alltså skrivit i 650 trådar. Om man räknar i inlägg blir det 2170 stycken (tabell forum_posts). 

Kan man inte optimera frågan lite?

Indexerade kolumner är markerade i fetstil:

```
SELECT 
	[b]ft.threadID[/b], 
	[b]ft.subject[/b], 
	[b]ft.userid[/b], 
	[b]m1.usr[/b], 
	[b]ft.room[/b], 
	[b]ft.last_post[/b], 
	ft.readers, 
	ft.answers, 
	ft.smiley, 
	[b]fp.id[/b], 
	[b]fp.userid[/b], 
	[b]fp.datum[/b], 
	[b]m2.usr[/b], 
	ft.poll, 
	ft.locked 
FROM
	forum_topics ft 
	inner join forum_posts fp on [b]fp.threadID[/b] = [b]ft.threadID[/b] 
	inner join members m1 on [b]ft.userid[/b] = [b]m1.id[/b] 
	inner join members m2 on [b]m2.id[/b] = [b]fp.userid[/b] 
        inner join forum_posts fp2 on [b]fp2.threadID[/b] = [b]ft.threadID[/b]
WHERE 
	[b]fp.userid[/b] = 1 
GROUP BY
	[b]ft.threadID[/b], 
	[b]ft.subject[/b], 
	[b]ft.userid[/b], 
	[b]m1.usr[/b], 
	[b]ft.room[/b], 
	[b]ft.last_post[/b], 
	ft.readers, 
	ft.answers, 
	ft.smiley, 
	[b]fp.id[/b], 
	[b]fp.userid[/b], 
	[b]fp.datum[/b], 
	[b]m2.usr[/b], 
	ft.poll, 
	ft.locked 
HAVING 
	[b]fp.datum[/b] = min([b]fp2.datum[/b])
ORDER BY
	[b]ft.room[/b] asc, [b]ft.last_post[/b] desc limit 0,20
```

Permalänk: https://www.webforum.nu/p/1508509

## #4 — LarsG, 2004-12-20T19:46Z

jaha, då får du väl undersöka vad explain säger.

Permalänk: https://www.webforum.nu/p/1509625

## #5 — ampy, 2004-12-20T19:57Z

Resultatet från explain är bifogat.

Bilagor:

- [larsg.gif](https://www.webforum.nu/a/5135.gif)

Permalänk: https://www.webforum.nu/p/1509635

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/118203-endast-ett-inlägg-en-tråd-skall-redovisas
