/ 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] Nyeste poster
Fra : Dann Pedersen


Dato : 14-08-02 11:18

Hejsa,

Jeg har bøvlet lidt med at finde de nyeste poster i en tabel. Lad os
forestille os at jeg har en tabel med nedenstående format (den er
simplificeret for nemhedens skyld, men problemstillingen består):

tabelID (Primærnøgle, der kun bruges til dette pt. - auto increment)
oprettelsesdato (et automatisk timestamp for hvornår data er indsat)
eksterntID (et ID, der referer til et eksternt objekt. - dette er en
fremmednøgle i mange enden af en en-til-mange relation).
indhold (en række felter til indholdet i posten)

Tabellen skal bruges i forbindelse med versionering. Der vil altså være
masser af poster med det samme 'eksterntID' - men med tabelID og
oprettelsesdato anderledes (indholdet vil højst sandsynligt også blive
ændret, men det kan ikke garanteres).

Det jeg er interesseret i er at trække de nyeste poster ud for hvet
'eksterntID'. Dette er ikke noget problem, når der kun er for et
"eksterntID" jeg ønsker at gøre det, da man her vil kunne trække alle ud,
rangordne dem efter dato og kun trække den øverste post ud. Men lige så
snart jeg skal bruge mere end en post - eks. en oversigt over alle poster
med forskellige 'eksterntID' i deres nyeste form, så løber jeg ind i
problemer.

Er der nogen, der har et godt bud på denne problemstilling? Da det er MySQL
der bliver brugt har jeg desværre ikke mulighed for subselects eller den
slags

Min ikke så pæne, men brugbare løsning, som jeg pt. overvejer at tage i brug
er at bruge et felt i en anden tabel til at indikere 'tabelID' for den
nyeste udgave, og så vedligeholde denne ved hver insert i ovenstående tabel.
Det er bare ikke en pæn løsning, så jeg håber at der er nogen, der har en
god ide.

På forhånd tak for hjælpen.

Venlig hilsen

Dann Pedersen



 
 
Nis Jørgensen (14-08-2002)
Kommentar
Fra : Nis Jørgensen


Dato : 14-08-02 12:39

On Wed, 14 Aug 2002 12:18:28 +0200, "Dann Pedersen"
<dann_pedersen@canwetalk.com> wrote:

>Det jeg er interesseret i er at trække de nyeste poster ud for hvet
>'eksterntID'. Dette er ikke noget problem, når der kun er for et
>"eksterntID" jeg ønsker at gøre det, da man her vil kunne trække alle ud,
>rangordne dem efter dato og kun trække den øverste post ud. Men lige så
>snart jeg skal bruge mere end en post - eks. en oversigt over alle poster
>med forskellige 'eksterntID' i deres nyeste form, så løber jeg ind i
>problemer.

Hvis mySQL efterhånden understøtter simple subselects (hvilket
adskillige folk har påstået i diverse grupper)og tabelID er stigende,
kunne du gøre noget i retning af ...

SELECT * FROM mintabel WHERE tabelID IN
(SELECT MAX(tabelID) FROM mintabel GROUP BY eksterntID)

Med timestamps bliver det en anelse langhåredere . Og uden subselects
(eller en tilsvarende konstruktion) tror jeg ikke det kan lade sig
gøre. Måske kan man lave noget med en self-join, men kønt bliver det
næppe.

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Dann Pedersen (14-08-2002)
Kommentar
Fra : Dann Pedersen


Dato : 14-08-02 13:52

"Nis Jørgensen" <nis@dkik.dk> wrote in message
news:e9dklu4neaj21dugl0i70ulbj59jhfb82s@4ax.com...
> Hvis mySQL efterhånden understøtter simple subselects (hvilket
> adskillige folk har påstået i diverse grupper)og tabelID er stigende,
> kunne du gøre noget i retning af ...
>
> SELECT * FROM mintabel WHERE tabelID IN
> (SELECT MAX(tabelID) FROM mintabel GROUP BY eksterntID)

Ovenstående mindre meget om hvad jeg havde i tankerne, da jeg lavede min
datamodelering. Jeg havde nemlig også hørt at MySQL nu kunne klare
subselects. Jeg downloaded så glad den nyeste alpha fra hjemmesiden men
måtte desværre efterfølgende konstater at det endnu ikke er implementeret:

Se kommentaren fra manualen på:

http://www.mysql.com/doc/en/ANSI_diff_Sub-selects.html

Og to-do listen:

http://www.mysql.com/doc/en/TODO_MySQL_4.1.html


> Med timestamps bliver det en anelse langhåredere . Og uden subselects
> (eller en tilsvarende konstruktion) tror jeg ikke det kan lade sig
> gøre. Måske kan man lave noget med en self-join, men kønt bliver det
> næppe.

Det har jeg også leget lidt med - og jeg kan godt få den nyeste ud for et
givent 'eksterntID' med nedenstående statement:

SELECT DISTINCT a1.* FROM tabelnavn AS a1, tabelnavn AS a2 WHERE
a1.eksterntID = a2.eksterntID AND a1.eksterntID =
'DET_EKSTERNE_ID_DER_SKAL_TRÆKKES_UD_FOR' ORDER BY a1.oprettelsesdato DESC
LIMIT 1;

(Bemærk at jeg ikke siger noget om at tabelID skal være større på den ene
side, da det udelukker de poster, der kun har en version).

Problemet opstår når jeg skal lave ovenstående for alle i tabellen og ikke
kun en enkelt. Nogen gode bud?

/Dann



Nis Jørgensen (14-08-2002)
Kommentar
Fra : Nis Jørgensen


Dato : 14-08-02 14:33

On Wed, 14 Aug 2002 14:52:29 +0200, "Dann Pedersen"
<dann_pedersen@canwetalk.com> wrote:

>
>> Med timestamps bliver det en anelse langhåredere . Og uden subselects
>> (eller en tilsvarende konstruktion) tror jeg ikke det kan lade sig
>> gøre. Måske kan man lave noget med en self-join, men kønt bliver det
>> næppe.
>
>Det har jeg også leget lidt med - og jeg kan godt få den nyeste ud for et
>givent 'eksterntID' med nedenstående statement:
>
>SELECT DISTINCT a1.* FROM tabelnavn AS a1, tabelnavn AS a2 WHERE
>a1.eksterntID = a2.eksterntID AND a1.eksterntID =
>'DET_EKSTERNE_ID_DER_SKAL_TRÆKKES_UD_FOR' ORDER BY a1.oprettelsesdato DESC
>LIMIT 1;
>
>(Bemærk at jeg ikke siger noget om at tabelID skal være større på den ene
>side, da det udelukker de poster, der kun har en version).
>
>Problemet opstår når jeg skal lave ovenstående for alle i tabellen og ikke
>kun en enkelt. Nogen gode bud?

Her er den. Spis den så.

SELECT DISTINCT a1.tabelID, a1.ExterntID, a1.EtAndetFelt, Count(*)
FROM tabelnavn AS a1 INNER JOIN tabelnavn AS a2
ON a1.eksterntID = a2.eksterntID
WHERE a1.oprettelsesdato >= a2.oprettelsesdato
GROUP BY a1.tabelID, a1.ExterntID, a1.EtAndetFelt
HAVING COUNT(*) = 1;

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Dann Pedersen (15-08-2002)
Kommentar
Fra : Dann Pedersen


Dato : 15-08-02 19:39

"Nis Jørgensen" <nis@dkik.dk> wrote in message
news:humklugpn6p75nlf4nmvsofu0brtv5uoc1@4ax.com...

> Her er den. Spis den så.
>
Og det gjorde både jeg og MySQL databasen. Eller sagt på en anden måde - det
virkede.

Tusind tusind tak for hjælpen!

Venlig hilsen

Dann Pedersen



Dann Pedersen (15-08-2002)
Kommentar
Fra : Dann Pedersen


Dato : 15-08-02 20:38


"Nis Jørgensen" <nis@dkik.dk> wrote in message
news:humklugpn6p75nlf4nmvsofu0brtv5uoc1@4ax.com...

> SELECT DISTINCT a1.tabelID, a1.ExterntID, a1.EtAndetFelt, Count(*)
> FROM tabelnavn AS a1 INNER JOIN tabelnavn AS a2
> ON a1.eksterntID = a2.eksterntID
> WHERE a1.oprettelsesdato >= a2.oprettelsesdato
> GROUP BY a1.tabelID, a1.ExterntID, a1.EtAndetFelt
> HAVING COUNT(*) = 1;
>

Til andre, der har samme problem: Vær obs. på at >= skal være et <= hvis det
er de nyeste poster der skal findes, mens det skal være som ovenfor, hvis
det er de ældste poster.

/Dann



Nis Jørgensen (16-08-2002)
Kommentar
Fra : Nis Jørgensen


Dato : 16-08-02 08:22

On Thu, 15 Aug 2002 21:37:31 +0200, "Dann Pedersen"
<dann_pedersen@canwetalk.com> wrote:

>
>"Nis Jørgensen" <nis@dkik.dk> wrote in message
>news:humklugpn6p75nlf4nmvsofu0brtv5uoc1@4ax.com...
>
>> SELECT DISTINCT a1.tabelID, a1.ExterntID, a1.EtAndetFelt, Count(*)
>> FROM tabelnavn AS a1 INNER JOIN tabelnavn AS a2
>> ON a1.eksterntID = a2.eksterntID
>> WHERE a1.oprettelsesdato >= a2.oprettelsesdato
>> GROUP BY a1.tabelID, a1.ExterntID, a1.EtAndetFelt
>> HAVING COUNT(*) = 1;
>>
>
>Til andre, der har samme problem: Vær obs. på at >= skal være et <= hvis det
>er de nyeste poster der skal findes, mens det skal være som ovenfor, hvis
>det er de ældste poster.

Skulle bare checke om du var vågen ...

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Dann Pedersen (18-08-2002)
Kommentar
Fra : Dann Pedersen


Dato : 18-08-02 00:27

"Nis Jørgensen" <nis@dkik.dk> wrote in message
news:rv9pluk4p2e9barv3fk09uvmraofduanci@4ax.com...
>
> Skulle bare checke om du var vågen ...



Faktisk så tror jeg at jeg er blevet mere vågen end jeg var før *S*. Jeg
havde aldrig overvejet at tælle antallet af rækker som et resultat af en
JOIN i forbindelse med forespørgsler overhovedet... så mine øjne er blevet
lidt mere åbne.

/Dann



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408524
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste