/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MySQL - Vælg nyeste poster
Fra : Harald


Dato : 13-02-08 23:51

Jeg bruger MySQL 4.0 (understøtter ikke subselect)

Jeg er ved at lave et lille forum og har disse 2 tabeller:

CREATE TABLE `forumtraad` (
`IDforumtraad` int(11) NOT NULL auto_increment,
`DatoTid` timestamp(14) NOT NULL,
`Gruppe` int(11) NOT NULL default '0',
`Emne` varchar(200) NOT NULL default '',
PRIMARY KEY (`IDforumtraad`)

CREATE TABLE `forumpost` (
`IDforumpost` int(11) NOT NULL auto_increment,
`DatoTid` timestamp(14) NOT NULL,
`Traad` int(11) NOT NULL default '0',
`Tekst` text NOT NULL,
PRIMARY KEY (`IDforumpost`)

Dvs. der under hver tråd (forumtraad) er en masse poster (forumpost). Feltet
Traad i forumpost er linket til IDforumtraad i forumtraad.

Jeg vil gerne have listet alle tråde således at den tråd med den nyeste post
kommer først, jeg har prøvet med:
SELECT *
FROM `forumtraad`
left join forumpost on forumtraad.IDforumtraad=forumpost.traad
group by emne
order by forumpost.datotid desc

men det virker jo ikke.

/H



 
 
Michael Zedeler (16-02-2008)
Kommentar
Fra : Michael Zedeler


Dato : 16-02-08 16:20

Harald wrote:
> CREATE TABLE `forumtraad` (
> `IDforumtraad` int(11) NOT NULL auto_increment,
> `DatoTid` timestamp(14) NOT NULL,
> `Gruppe` int(11) NOT NULL default '0',
> `Emne` varchar(200) NOT NULL default '',
> PRIMARY KEY (`IDforumtraad`)
>
> CREATE TABLE `forumpost` (
> `IDforumpost` int(11) NOT NULL auto_increment,
> `DatoTid` timestamp(14) NOT NULL,
> `Traad` int(11) NOT NULL default '0',
> `Tekst` text NOT NULL,
> PRIMARY KEY (`IDforumpost`)
>
> Dvs. der under hver tråd (forumtraad) er en masse poster (forumpost). Feltet
> Traad i forumpost er linket til IDforumtraad i forumtraad.
>
> Jeg vil gerne have listet alle tråde således at den tråd med den nyeste post
> kommer først, jeg har prøvet med:

Kig lidt på HAVING. Det burde løse problemet hvis dine auto_increment
virkelig er fortløbende.

Mvh. Michael.

Harald (16-02-2008)
Kommentar
Fra : Harald


Dato : 16-02-08 20:46

"Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
news:qaDtj.48$MR7.7@news.get2net.dk...
> Harald wrote:
>> CREATE TABLE `forumtraad` (
>> `IDforumtraad` int(11) NOT NULL auto_increment,
>> `DatoTid` timestamp(14) NOT NULL,
>> `Gruppe` int(11) NOT NULL default '0',
>> `Emne` varchar(200) NOT NULL default '',
>> PRIMARY KEY (`IDforumtraad`)
>>
>> CREATE TABLE `forumpost` (
>> `IDforumpost` int(11) NOT NULL auto_increment,
>> `DatoTid` timestamp(14) NOT NULL,
>> `Traad` int(11) NOT NULL default '0',
>> `Tekst` text NOT NULL,
>> PRIMARY KEY (`IDforumpost`)
>>
>> Dvs. der under hver tråd (forumtraad) er en masse poster (forumpost).
>> Feltet Traad i forumpost er linket til IDforumtraad i forumtraad.
>>
>> Jeg vil gerne have listet alle tråde således at den tråd med den nyeste
>> post kommer først, jeg har prøvet med:
>
> Kig lidt på HAVING. Det burde løse problemet hvis dine auto_increment
> virkelig er fortløbende.

Jeg kan ikke finde på nogen løsning med HAVING?

/H



Michael Zedeler (17-02-2008)
Kommentar
Fra : Michael Zedeler


Dato : 17-02-08 10:03

Harald wrote:
> "Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
> news:qaDtj.48$MR7.7@news.get2net.dk...
>> Harald wrote:
>>> CREATE TABLE `forumtraad` (
>>> `IDforumtraad` int(11) NOT NULL auto_increment,
>>> `DatoTid` timestamp(14) NOT NULL,
>>> `Gruppe` int(11) NOT NULL default '0',
>>> `Emne` varchar(200) NOT NULL default '',
>>> PRIMARY KEY (`IDforumtraad`)
>>>
>>> CREATE TABLE `forumpost` (
>>> `IDforumpost` int(11) NOT NULL auto_increment,
>>> `DatoTid` timestamp(14) NOT NULL,
>>> `Traad` int(11) NOT NULL default '0',
>>> `Tekst` text NOT NULL,
>>> PRIMARY KEY (`IDforumpost`)
>>>
>>> Dvs. der under hver tråd (forumtraad) er en masse poster (forumpost).
>>> Feltet Traad i forumpost er linket til IDforumtraad i forumtraad.
>>>
>>> Jeg vil gerne have listet alle tråde således at den tråd med den nyeste
>>> post kommer først, jeg har prøvet med:
>> Kig lidt på HAVING. Det burde løse problemet hvis dine auto_increment
>> virkelig er fortløbende.
>
> Jeg kan ikke finde på nogen løsning med HAVING?

SELECT IDforumtraad, Tekst, MAX(IDforumpost)
FROM forumpost, forumtrååd
WHERE Traad = IDforumtraad
GROUP BY IDforumtraad, Tekst
HAVING MAX(IDforumpost) = IDforumpost

Det er iøvrigt en mærkelig navngivning, du kører med. Enten kan du kalde
fremmednøgler navnet på den tabel, de henviser til (så feltet Traad
bliver til forumtraad), eller også bruger du samme navn begge steder.
DatoTid og Tekst er også nogle dårlige navne, da de kun beskriver
formatet men ikke hvad de bliver brugt til.

Mvh. Michael.

Harald (17-02-2008)
Kommentar
Fra : Harald


Dato : 17-02-08 11:01

"Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
news:UKStj.12$Bx4.6@news.get2net.dk...
> Harald wrote:
>> "Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
>> news:qaDtj.48$MR7.7@news.get2net.dk...
>>> Harald wrote:
>>>> CREATE TABLE `forumtraad` (
>>>> `IDforumtraad` int(11) NOT NULL auto_increment,
>>>> `DatoTid` timestamp(14) NOT NULL,
>>>> `Gruppe` int(11) NOT NULL default '0',
>>>> `Emne` varchar(200) NOT NULL default '',
>>>> PRIMARY KEY (`IDforumtraad`)
>>>>
>>>> CREATE TABLE `forumpost` (
>>>> `IDforumpost` int(11) NOT NULL auto_increment,
>>>> `DatoTid` timestamp(14) NOT NULL,
>>>> `Traad` int(11) NOT NULL default '0',
>>>> `Tekst` text NOT NULL,
>>>> PRIMARY KEY (`IDforumpost`)
>>>>
>>>> Dvs. der under hver tråd (forumtraad) er en masse poster (forumpost).
>>>> Feltet Traad i forumpost er linket til IDforumtraad i forumtraad.
>>>>
>>>> Jeg vil gerne have listet alle tråde således at den tråd med den nyeste
>>>> post kommer først, jeg har prøvet med:
>>> Kig lidt på HAVING. Det burde løse problemet hvis dine auto_increment
>>> virkelig er fortløbende.
>>
>> Jeg kan ikke finde på nogen løsning med HAVING?
>
> SELECT IDforumtraad, Tekst, MAX(IDforumpost)
> FROM forumpost, forumtrååd
> WHERE Traad = IDforumtraad
> GROUP BY IDforumtraad, Tekst
> HAVING MAX(IDforumpost) = IDforumpost
>
> Det er iøvrigt en mærkelig navngivning, du kører med. Enten kan du kalde
> fremmednøgler navnet på den tabel, de henviser til (så feltet Traad bliver
> til forumtraad), eller også bruger du samme navn begge steder. DatoTid og
> Tekst er også nogle dårlige navne, da de kun beskriver formatet men ikke
> hvad de bliver brugt til.

Det giver ikke det rigtige resultat.

SELECT IDforumtraad, forumpost.IDforumpost, Tekst, MAX(IDforumpost)
FROM forumpost, forumtraad
WHERE Traad = IDforumtraad
GROUP BY IDforumtraad, Emne
HAVING MAX(IDforumpost) = IDforumpost

Jeg har f.eks. 4 poster i forumtraad og resultatet burde så være 4 poster,
men jeg får kun 1 post tilbage, og jeg kan ikke lige se hvorfor det lige
bliver den.

/H



Michael Zedeler (17-02-2008)
Kommentar
Fra : Michael Zedeler


Dato : 17-02-08 20:12

Harald wrote:
> "Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
> news:UKStj.12$Bx4.6@news.get2net.dk...
>> Harald wrote:
>>> "Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
>>> news:qaDtj.48$MR7.7@news.get2net.dk...
>>>> Harald wrote:
>>>>> CREATE TABLE `forumtraad` (
>>>>> `IDforumtraad` int(11) NOT NULL auto_increment,
>>>>> `DatoTid` timestamp(14) NOT NULL,
>>>>> `Gruppe` int(11) NOT NULL default '0',
>>>>> `Emne` varchar(200) NOT NULL default '',
>>>>> PRIMARY KEY (`IDforumtraad`)
>>>>>
>>>>> CREATE TABLE `forumpost` (
>>>>> `IDforumpost` int(11) NOT NULL auto_increment,
>>>>> `DatoTid` timestamp(14) NOT NULL,
>>>>> `Traad` int(11) NOT NULL default '0',
>>>>> `Tekst` text NOT NULL,
>>>>> PRIMARY KEY (`IDforumpost`)
>>>>>
>>>>> Dvs. der under hver tråd (forumtraad) er en masse poster (forumpost).
>>>>> Feltet Traad i forumpost er linket til IDforumtraad i forumtraad.
>>>>>
>>>>> Jeg vil gerne have listet alle tråde således at den tråd med den nyeste
>>>>> post kommer først, jeg har prøvet med:
>>>> Kig lidt på HAVING. Det burde løse problemet hvis dine auto_increment
>>>> virkelig er fortløbende.
>>> Jeg kan ikke finde på nogen løsning med HAVING?
>> SELECT IDforumtraad, Tekst, MAX(IDforumpost)
>> FROM forumpost, forumtrååd
>> WHERE Traad = IDforumtraad
>> GROUP BY IDforumtraad, Tekst
>> HAVING MAX(IDforumpost) = IDforumpost
>>
>> Det er iøvrigt en mærkelig navngivning, du kører med. Enten kan du kalde
>> fremmednøgler navnet på den tabel, de henviser til (så feltet Traad bliver
>> til forumtraad), eller også bruger du samme navn begge steder. DatoTid og
>> Tekst er også nogle dårlige navne, da de kun beskriver formatet men ikke
>> hvad de bliver brugt til.
>
> Det giver ikke det rigtige resultat.
>
> SELECT IDforumtraad, forumpost.IDforumpost, Tekst, MAX(IDforumpost)
> FROM forumpost, forumtraad
> WHERE Traad = IDforumtraad
> GROUP BY IDforumtraad, Emne
> HAVING MAX(IDforumpost) = IDforumpost

Hvad for resultat får du så med denne her?

> Jeg har f.eks. 4 poster i forumtraad og resultatet burde så være 4 poster,
> men jeg får kun 1 post tilbage, og jeg kan ikke lige se hvorfor det lige
> bliver den.

Der kommer en række ud i resultatet for hver række i forumtraad, der har
mindst en tilhørende række i forumpost. Hvis du får færre rækker ud end
forventet, er det nok fordi du har tråde uden tilhørende "poster".

Du er nødt til at have samme felter i GROUP BY som der står efter
SELECT. Jeg mener at mysql i visse versioner ikke klager når man begår
denne fejl, men så vidt jeg ved er det ikke en gyldig sætning.

Så skriver du

SELECT IDforumtraad, forumpost.IDforumpost, Tekst, MAX(IDforumpost)

skal du også skrive

GROUP BY IDforumtraad, forumpost.IDforumpost, Tekst

Mvh. Michael.

Harald (17-02-2008)
Kommentar
Fra : Harald


Dato : 17-02-08 23:00

"Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
news:9G%tj.65$Fh2.13@news.get2net.dk...
> Harald wrote:
>> "Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
>> news:UKStj.12$Bx4.6@news.get2net.dk...
>>> Harald wrote:
>>>> "Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
>>>> news:qaDtj.48$MR7.7@news.get2net.dk...
>>>>> Harald wrote:
>>>>>> CREATE TABLE `forumtraad` (
>>>>>> `IDforumtraad` int(11) NOT NULL auto_increment,
>>>>>> `DatoTid` timestamp(14) NOT NULL,
>>>>>> `Gruppe` int(11) NOT NULL default '0',
>>>>>> `Emne` varchar(200) NOT NULL default '',
>>>>>> PRIMARY KEY (`IDforumtraad`)
>>>>>>
>>>>>> CREATE TABLE `forumpost` (
>>>>>> `IDforumpost` int(11) NOT NULL auto_increment,
>>>>>> `DatoTid` timestamp(14) NOT NULL,
>>>>>> `Traad` int(11) NOT NULL default '0',
>>>>>> `Tekst` text NOT NULL,
>>>>>> PRIMARY KEY (`IDforumpost`)
>>>>>>
>>>>>> Dvs. der under hver tråd (forumtraad) er en masse poster (forumpost).
>>>>>> Feltet Traad i forumpost er linket til IDforumtraad i forumtraad.
>>>>>>
>>>>>> Jeg vil gerne have listet alle tråde således at den tråd med den
>>>>>> nyeste post kommer først, jeg har prøvet med:
>>>>> Kig lidt på HAVING. Det burde løse problemet hvis dine auto_increment
>>>>> virkelig er fortløbende.
>>>> Jeg kan ikke finde på nogen løsning med HAVING?
>>> SELECT IDforumtraad, Tekst, MAX(IDforumpost)
>>> FROM forumpost, forumtrååd
>>> WHERE Traad = IDforumtraad
>>> GROUP BY IDforumtraad, Tekst
>>> HAVING MAX(IDforumpost) = IDforumpost
>>>
>>> Det er iøvrigt en mærkelig navngivning, du kører med. Enten kan du kalde
>>> fremmednøgler navnet på den tabel, de henviser til (så feltet Traad
>>> bliver til forumtraad), eller også bruger du samme navn begge steder.
>>> DatoTid og Tekst er også nogle dårlige navne, da de kun beskriver
>>> formatet men ikke hvad de bliver brugt til.
>>
>> Det giver ikke det rigtige resultat.
>>
>> SELECT IDforumtraad, forumpost.IDforumpost, Tekst, MAX(IDforumpost)
>> FROM forumpost, forumtraad
>> WHERE Traad = IDforumtraad
>> GROUP BY IDforumtraad, Emne
>> HAVING MAX(IDforumpost) = IDforumpost
>
> Hvad for resultat får du så med denne her?

Den løsning du skrev giver en fejl:
[root@localhost:3306] ERROR 1054: Unknown column 'IDforumpost' in 'having
clause'

så derfor ændrede jeg den lidt.


>> Jeg har f.eks. 4 poster i forumtraad og resultatet burde så være 4
>> poster, men jeg får kun 1 post tilbage, og jeg kan ikke lige se hvorfor
>> det lige bliver den.
>
> Der kommer en række ud i resultatet for hver række i forumtraad, der har
> mindst en tilhørende række i forumpost. Hvis du får færre rækker ud end
> forventet, er det nok fordi du har tråde uden tilhørende "poster".

Alle tråde har 2 eller flere "poster"

> Du er nødt til at have samme felter i GROUP BY som der står efter SELECT.
> Jeg mener at mysql i visse versioner ikke klager når man begår denne fejl,
> men så vidt jeg ved er det ikke en gyldig sætning.
>
> Så skriver du
>
> SELECT IDforumtraad, forumpost.IDforumpost, Tekst, MAX(IDforumpost)
>
> skal du også skrive
>
> GROUP BY IDforumtraad, forumpost.IDforumpost, Tekst

Det ændre ikke på resultatet. Jeg har prøvet mange forskellige variationer
men uden held. Men nu har jeg lavet en "manuel" løsning der virker, jeg
opdatere en "SenestePost" i traad tabellen hver gang der oprettes en ny
post.

Men tak for hjælpen alligevel.

/H



Søg
Reklame
Statistik
Spørgsmål : 177578
Tips : 31968
Nyheder : 719565
Indlæg : 6409072
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste