Select Distinct .... Order By - Problem!

Permalänk
Medlem

Select Distinct .... Order By - Problem!

Hejsan alla MySQLkunnigt folk!

Har tittat runt en hel del på nätet efter en lösning på mitt problem, och jag har försökt få till det i ett antal timmar men inte lyckats.

Problemet är som följer:

Jag håller på att göra ett enkelt forum men har stött på ett jobbigt problem...

Jag skulle vilja göra:

SELECT DISTINCT threadId FROM tabell ORDER BY id DESC

Detta skulle alltså ge mig alla enskilda trådar i "tabell" och sorteras efter senaste inlägget. Men när jag försöker med det där så hittar den ju inget eftersom id inte är selected också. Och selectar jag id så får jag upp alla enskilda inlägg istället för bara trådarna :(.

Har hittat lite grejor om att lägga till typ "IN (SELECT id FROM tabell ORDER BY id DESC)" men inte lyckats få till det heller.

Vad göra? Någon som stött på samma problem och lyckats lösa det på något smart sätt?

//MVH, Jeppe

Visa signatur

/Jeppe

Permalänk
Medlem

Om du har värden i tabellen borde din fråga returnera någonting. Kan du ge ett exempel på hur datan i din tabell ser ut? Är det id som är PK i din tabell?

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem

SELECT DISTINCT threadId FROM tabell WHERE IsSelected = 1 ORDER BY id DESC

Något sådant kanske? Men som Phod säger är det bättre med en tabell med exempeldata.

Permalänk
Medlem

Phod: Måste bara börja med att buga mig för din bild, hahahaha! Sjukt rolig Är det du som gjort den?

Exempeldata?... Ordna en temporär tabell alltså, som man sedan tar ut distinct threadId från?

Ska kolla på vad IsSelected gör... Tack för svaren!

Min tabell ser ut:

CREATE TABLE `forum` (
`id` int(11) NOT NULL auto_increment,
`motherId` int(11) default NULL,
`threadId` int(11) default NULL,
`type` tinyint(1) default NULL,
`userId` int(11) default NULL,
`topic` varchar(255) default NULL,
`message` text,
`ts` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
FULLTEXT KEY `topic` (`topic`,`message`)
);

Visa signatur

/Jeppe

Permalänk
Medlem

jag tycker inte att du borde ha trådar och inlägg i samma tabell, det känns faktiskt rätt opraktiskt.

Dela upp dem i två tabeller så blir detta problem löst automagiskt.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Sirjeppe
Phod: Måste bara börja med att buga mig för din bild, hahahaha! Sjukt rolig Är det du som gjort den?

Exempeldata?... Ordna en temporär tabell alltså, som man sedan tar ut distinct threadId från?

Nej, det är inte jag som gjort bilden.

Med exempeldata menar jag något sådant:

id threadId 1 10 2 10 3 20 4 20

Om man kör din SQL-sats på denna data får man följande resultat:

20 10

Så eftersom SQL-satsen returnerar något borde det vara innehållet i din tabell som inte är riktigt rätt, därför är det intressant att se hur det ser ut.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Sirjeppe
Phod: Måste bara börja med att buga mig för din bild, hahahaha! Sjukt rolig Är det du som gjort den?

Exempeldata?... Ordna en temporär tabell alltså, som man sedan tar ut distinct threadId från?

Ska kolla på vad IsSelected gör... Tack för svaren!

Min tabell ser ut:

CREATE TABLE `forum` (
`id` int(11) NOT NULL auto_increment,
`motherId` int(11) default NULL,
`threadId` int(11) default NULL,
`type` tinyint(1) default NULL,
`userId` int(11) default NULL,
`topic` varchar(255) default NULL,
`message` text,
`ts` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
FULLTEXT KEY `topic` (`topic`,`message`)
);

Nej nej, jag gissade att du hade en kolumn som hete Selected eller liknande efter vad du skrev i ett tidigare inlägg.

Om motherid är det föregående inlägget i tråden borde fråga vara ungefär som nedan

SELECT DISTINCT threadId FROM tabell WHERE motherId = NULL ORDER BY id DESC

Permalänk
Medlem

Ah, ok!...

Ja, precis... Det är det resultatet jag får... Men om databasen skulle se ut såhär (vilket den förmodligen alltid kommer att göra):

id threadId 1 10 2 20 3 10 4 20 5 10

... så kommer ju fortfarande tråden 20 att sorteras till förstaplatsen - även om id 5 borde göra att tråd 10 borde ligga överst (eftersom senaste inlägget ligger i den tråden). Problemet är (och det är även erkänt i MySQLs dokumentation) att det inte går att använda ORDER BY på en cell som inte är definierad under SELECT... och jag har inte hittat någon lösning någonstans

Gör jag:

SELECT DISTINCT id,threadId FROM tabell ORDER BY id DESC

så kommer den att lista alla unika id också :(... och det vill jag ju inte - det blir ju alla inlägg i hela forumet, i alla trådar!

Visa signatur

/Jeppe

Permalänk
Medlem

Aha, är det det här du är ute efter?

SELECT DISTINCT t.threadId FROM ( SELECT id, threadId FROM tabell ORDER BY id DESC ) AS t;

Jag trodde att din query inte returnerade något eftersom du skrev "Men när jag försöker med det där så hittar den ju inget".

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem

YEEEEES! :D...

TACK Phod... Har seriöst suttit med det här i typ 6 timmar kanske och inte lyckats Dokumentationen kring det här var inte så bra tycker jag

Men nu funkar det och jag är grymt lättad!

Tack igen

//Jeppe

Visa signatur

/Jeppe

Permalänk

Tycker fortfarande du ska lägga ner, planera MYCKET mer och faktiskt kanske köpa en bok om databaser.
Det där är typ GALET fel sätt att göra en relationsdatabas.

Jag skulle gjort följande:

Forum {
int ID,
char Name
}

Thread {
int ID,
char Name
}

ThreadInForum {
int FID, // Forumid
int TID // Threadid
}

Post {
int ID,
int RespondTo, // Vilket inlägg vi svarar på, 0 för inget.
char Title,
char Message,
int TID // Vilken tråd vi postar i.
}

Så skulle jag kanske bygga upp ett forum, man måste tänka sig i relationer.

Ett forum kan ha relationer till andra forum, dela upp data i ett par tabeller istället för att lägga massa data i samma tabell.

Trådar har relationer till Forum och Poster har relationer till Trådar.

Permalänk
Medlem

hagbarddenstore har helt rätt i det han säger. Det är så man ska bygga databasen för ett forum.

Även om det är några detaljer som jag är osäker på om jag håller med om, men det beror ju på hur man vill att forumet ska fungera. T.ex. så tycker jag att threadinforum kan tas bort förutsatt att man inte behöver en tråd som ska kunna ligga i flera forum samtidigt (låter mysko?!), forumId kan man ha som fält i thread-tabellen... RespondTo använder jag hellre inte i mina forum eftersom man mycket väl kan citera flera inlägg samtidigt (och att man imho inte behöver lagra vem som citeras), men annars var det precis som jag själv skulle ha sagt.