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