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