|
| MySQL vælg nyeste dato Fra : Peter |
Dato : 08-10-08 11:54 |
|
Hej
Jeg har 2 tabeller, personer og kort. Hver person kan have mange kort.
personer:
idkode : int
navn: varchar
kort
person : int //ejer af kortet
gyldigtil : date
Det jeg ønsker er at få et resultat hvor hver person kun er med en enkelt
gang med det kort som har den nyeste gyldigtil dato.
Kan det lade sig gøre?
/P
| |
Peter (08-10-2008)
| Kommentar Fra : Peter |
Dato : 08-10-08 12:23 |
|
"Peter" <nomail@nomail.dk> skrev i en meddelelse
news:48ec9164$0$90273$14726298@news.sunsite.dk...
> Hej
>
> Jeg har 2 tabeller, personer og kort. Hver person kan have mange kort.
>
> personer:
> idkode : int
> navn: varchar
>
> kort
> person : int //ejer af kortet
> gyldigtil : date
>
> Det jeg ønsker er at få et resultat hvor hver person kun er med en enkelt
> gang med det kort som har den nyeste gyldigtil dato.
>
> Kan det lade sig gøre?
Jeg fandt ud af det ved at benytte Max()
select personer.*, max(gyldigtil) from personer
left join kort on kort.person=personer.idkode
group by personer.idkode
Men mit enlige mål er at kunne slette de personer hvor kortets gyldigtil
dato er overskredet med en uge. Dvs. hvis det kort med den nyeste gyldigtil
dato er en uge gammel så skal personen slettes, kortet skal ikke slettes.
Kan det lade sig gøre?
/P
| |
Lars Kongshøj (08-10-2008)
| Kommentar Fra : Lars Kongshøj |
Dato : 08-10-08 12:31 |
|
Peter wrote:
> Men mit enlige mål er at kunne slette de personer hvor kortets gyldigtil
> dato er overskredet med en uge. Dvs. hvis det kort med den nyeste gyldigtil
> dato er en uge gammel så skal personen slettes, kortet skal ikke slettes.
Du kan vælge de personer, der skal slettes, ved at tilføje en
having-klausul til din select:
....
having max(gyldigtil) < [ønsket dato]
--
Lars Kongshøj
Oracle- og Unix-konsulent søger opgaver
http://www.kongshoj.com
| |
Troels Arvin (08-10-2008)
| Kommentar Fra : Troels Arvin |
Dato : 08-10-08 12:26 |
|
Peter wrote:
[...]
> Det jeg ønsker er at få et resultat hvor hver person kun er med en
> enkelt gang med det kort som har den nyeste gyldigtil dato.
[...]
Der er ingen kortnumre i kort-tabellen?
Bortset fra det, så skal du bruge noget i stil med:
SELECT navn,
MAX(gyldigtil)
FROM personer AS p
JOIN kort AS k
ON p.idkode = k.person
GROUP BY navn
--
Troels
| |
Peter (08-10-2008)
| Kommentar Fra : Peter |
Dato : 08-10-08 12:31 |
|
"Troels Arvin" <troels@arvin.dk> skrev i en meddelelse
news:gci5cp$oav$1@news.net.uni-c.dk...
> Peter wrote:
> [...]
>> Det jeg ønsker er at få et resultat hvor hver person kun er med en
>> enkelt gang med det kort som har den nyeste gyldigtil dato.
> [...]
>
> Der er ingen kortnumre i kort-tabellen?
>
> Bortset fra det, så skal du bruge noget i stil med:
>
> SELECT navn,
> MAX(gyldigtil)
> FROM personer AS p
> JOIN kort AS k
> ON p.idkode = k.person
> GROUP BY navn
Ja tak for det, det var også hvad jeg nåede frem til, se forrige post.
Jeg har kortnummer i min tabel plus mange andre felter, ville bare gøre det
lettere for mig selv og andre her i NG´en.
/P
| |
Peter (08-10-2008)
| Kommentar Fra : Peter |
Dato : 08-10-08 17:33 |
|
Jeg troede det var lettere hvis problemet blev del op men det var det ikke,
så her komme hele problemet.
Jeg har 2 tabeller, personer og kort, jeg har fjernet de felter de ikke er
relevante her. Hver person kan have mange kort.
personer:
idkode : int
navn: varchar
kort
person : int //ejer af kortet
status : int
gyldigtil : date
Det jeg ønsker er at udvælge de personer som:
Ingen kort har hvor status er <10
Hvor GyldigTil er 21 dage mindre end dags dato
Jeg er nået frem til dette:
select s1.idkode, kort.status, max(kort.gyldigtil) from (select
personer.idkode from personer
left join kort on kort.person=personer.idkode and status<10
where kort.idkode is null
group by personer.idkode) as s1
left join kort on kort.person=s1.idkode
where datediff(now(),gyldigtil)>21
group by s1.idkode
Den inderste SELECT vælger de personer som ingen kort har med status<10
Den yderste SELECT vælger nu alle de personer hvor max GyldigTil er 21+ dage
før dags dato
Jeg går ud fra at når jeg skriver max(kort.gyldigtil) og derefter group by
s1.idkode så får jeg kun en post og det er den med den nyeste GyldigTil
dato?
Hvis ovenstående er i orden så mangler jeg kun at ændre min SELECT til en
DELETE i stedet, det har jeg så ikke fundet ud af endnu?
/P
| |
|
|