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



Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407944
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste