Avatar billede d9ha2 Nybegynder
08. oktober 2010 - 10:28 Der er 10 kommentarer og
1 løsning

trække maxværdi + id-felt fra samme tabel

Hej Eksperter,

Jeg kan ikke finde ud af at hente de records fra en tabel hvor datoværdien er højest for hver forekomst af fremmednøglen fra en anden tabel. Måske er der hjælp at hente her?

2 tabeller: Udstyr og Godkend. For hvert stykke udstyr kan der forekomme flere godkendelser. Jeg skal have fat i den seneste godkendelse på hvert stykke udstyr. Jeg skal bruge både UdstyrID, Max GodkendDato og GodkendID for hvert stykke udstyr i Godkendtabellen.

t_Udstyr har felterne: Identitet(primær nøgle), Navn, Købsdato, typenr, statusnr, Bemærkning, Ejer, Lokation, Godk (fremmednøgle til t_Godkend)

t_Godkend har felterne: GodkendID (primær nøgle), GodkDato, Godkender, GodkendLobetid, Udstyr (fremmednøgle til t_Udstyr)
Avatar billede Authiel Nybegynder
08. oktober 2010 - 10:40 #1
Kunne det være det her du leder efter?

$query = mysql_query("SELECT GodkendID, MAX(GodkDato), Udstyr FROM t_Godkend GROUP BY Udstyr");

while($row = mysql_fetch_assoc($query)){
    echo 'Godkend id: ' . $row['GodkendID'] . '<br />';
    echo 'Godkend dato: ' . $row['MAX(GodkDato)'] . '<br />';
    echo 'Udstyr id: ' . $row['Udstyr'];
}

(Taget fra http://www.tizag.com/mysqlTutorial/mysqlgroupby.php , omskrevet af mig) :D
Avatar billede Syska Mester
08. oktober 2010 - 10:58 #2
Du bliver nød til også at lave en MAX på GodkendID eller er det jo unikt for hver row ...

GodkendID er jo også automatisk i sanmme row som din MAX(dato)

mvh
Avatar billede d9ha2 Nybegynder
08. oktober 2010 - 10:59 #3
Naarrh, den holder ikke helt.  Jeg kan ikke undlade at gruppere på GodkendID også, og så ryger idéen ligesom, da jeg kun skal have 1 GodkendID for hver Udstyr nemlig den hvor Datoen er Maxdato for udstyrsnummeret.

Jeg tror jeg selv har fået fat i det, men jeg holder lige spørgsmålet åbent, da jeg skal have kædet den sammen med en anden forespørgsel for at få en rapport ud af det i Access.

Nedenstående ser umiddelbart ud til at kunne gøre det:

SELECT t_Godkend.Udstyr, t_Godkend.GodkendID, t_Godkend.GodkDato
FROM t_Godkend
WHERE  t_Godkend.GodkDato = (Select max(g.GodkDato) FROM t_Godkend as g WHERE g.Udstyr = t_Godkend.Udstyr)
Avatar billede d9ha2 Nybegynder
08. oktober 2010 - 11:01 #4
Havde ikke lige set dit indlæg buzzzz, men det er rigtigt at jeg må aggregere på GodkendID også, men som sagt ovenover så er det jo unikt (primærnøgle) så det giver ikke lige noget
Avatar billede Syska Mester
08. oktober 2010 - 11:07 #5
Jeg kan ikke lige gennemskue dine navne helt, så dette er bare et eksemple.

SELECT * FROM Udstyr AS U INNER JOIN
(SELECT MAX(GodkendID) FROM Godkend GROUP BY UdstyrId) AS G
ON G.UdstyrId = U.UdStyrId

Vel og mørket hvis dit GodkendId er en incremental value ... identity og hvad det ellers kan hedde.

mvh
Avatar billede d9ha2 Nybegynder
08. oktober 2010 - 11:21 #6
Hej Buzzz, GodkendID er autonummer. Men dels er det værdierne fra t_Godkend jeg er interesseret i og dels ser det ikke ud til at Access kan tygge sig gennem din sql, da den ikke kan se dine join felter (G.UdstyrID og U.UdstyrID). Men jeg tror, at jeg har løsningen, skal bage "liige" kombinere den med en anden forespørgsel
Avatar billede Syska Mester
08. oktober 2010 - 11:32 #7
Jeg brugte fiktive felt navne for at jeg nemmere kunne gennemskue hvad den sql skulle gøre. Så du skal nok ændre lidt navne etc. for at den virker.

Men ideen er at hente seneste GodkendId ud ... og derefter begynde at joine.

mvh
Avatar billede d9ha2 Nybegynder
08. oktober 2010 - 11:38 #8
Havde rettet feltnavne og tabelnavne til. Men lad det ligge et øjeblik, jeg vender lige tilbage lidt senere.
Avatar billede d9ha2 Nybegynder
12. oktober 2010 - 08:54 #9
Fik løst det. Problemet var et felt der var havnet i den forkerte tabel i databaseopbygningen Der skulle ikke være en reference til t_Godkend i t_Udstyr, da t_udstyr er 1 siden i 1:M relationen mellem de to tabeller.

Find records med maxdato per Udstyr:

SELECT t_Godkend.Udstyr, t_Godkend.GodkendID, t_Godkend.GodkDato, t_Godkend.Godkender, t_Godkend.GodkLobetid
FROM t_Godkend
WHERE t_Godkend.GodkDato = (Select max(g.GodkDato) FROM t_Godkend as g WHERE g.Udstyr = t_Godkend.Udstyr);


Find Oplysninger om Udstyr fra t_Udstyr, t_Status og t_Lokation:

SELECT t_Udstyr.Identitet, t_Udstyr.Navn, t_Udstyr.Godk, t_Udstyr.Ejer, t_Status.Status, t_Lokation.LokNavn
FROM t_Status INNER JOIN (t_Lokation INNER JOIN t_Udstyr ON t_Lokation.LokID = t_Udstyr.Lokation) ON t_Status.StatusID = t_Udstyr.StatusNr
WHERE (((t_Udstyr.Godk) Is Not Null));


Join de 2 forespørgsler og beregn udløbsdato:

SELECT f_Godkend2.Identitet, f_Godkend2.Ejer, f_Godkend2.Status, f_Godkend2.Navn, f_Godkend2.LokNavn, DateAdd("d",[F_Godkend1.GodkLobetid],F_Godkend1.GodkDato) AS Udlob, F_Godkend1.Godkender
FROM F_Godkend1 INNER JOIN f_Godkend2 ON F_Godkend1.Udstyr = f_Godkend2.Identitet;


Takker Authiel og Buzzzz for hjælpen. Buzzzz må gerne lægge et svar, så jeg kan give point.
Avatar billede Syska Mester
12. oktober 2010 - 09:17 #10
svar.

Men jeg ville nu igen kigge på min løsning, da din giver en N + 1 quries, da du laver mange selects.

I min laver jeg 2 for at finde alle ... de gør præcis det samme, din laver bare utroligt maneg subquries.

mvh
Avatar billede d9ha2 Nybegynder
12. oktober 2010 - 09:37 #11
Ja, er med på at det ikke ligefrem er performance fremmende, med da det er til en DB med ganske få brugere. springer jeg over i første omgang, og moser videre. Men du skal have tak for dit input.

mvh
Henrik
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester