/ 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 og DELETE
Fra : Peter


Dato : 19-11-08 15:04

Jeg har 2 tabeller. Personer som indeholder person oplysninger og kort som
indeholder kort oplysninger, hver person kan have mange kort.

Kort status kan være 1 for udleveret eller 10 for slettet, jeg skal have
fundet de personer som ingen kort har eller kun har kort hvor status er 10.
Hvis personer ingen kort har så skal oprettetdato for personen være ældre
end 90 dage
Hvis personer har kort så skal nyeste slettetdato for kortet være ældre end
90 dage

Denne SQL ser ud til at gøre lige det:

SELECT personer.*, kort.*, min(kort.status) as minstatus,
max(kort.slettetdato) as maxslettetdato
FROM personer
left join kort on personer.idkode=kort.person
group by personer.idkode
having (kort.status is null and
personer.oprettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY)) or (minstatus=10
and maxslettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY))

Alle de fundne _personer_ skal nu slettes, hvordan gør jeg det?

/P



 
 
Michael Zedeler (19-11-2008)
Kommentar
Fra : Michael Zedeler


Dato : 19-11-08 23:28

Peter wrote:
> Jeg har 2 tabeller. Personer som indeholder person oplysninger og kort som
> indeholder kort oplysninger, hver person kan have mange kort.
>
> Kort status kan være 1 for udleveret eller 10 for slettet, jeg skal have
> fundet de personer som ingen kort har eller kun har kort hvor status er 10.
> Hvis personer ingen kort har så skal oprettetdato for personen være ældre
> end 90 dage
> Hvis personer har kort så skal nyeste slettetdato for kortet være ældre end
> 90 dage
>
> Denne SQL ser ud til at gøre lige det:
>
> SELECT personer.*, kort.*, min(kort.status) as minstatus,
> max(kort.slettetdato) as maxslettetdato
> FROM personer
> left join kort on personer.idkode=kort.person
> group by personer.idkode
> having (kort.status is null and
> personer.oprettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY)) or (minstatus=10
> and maxslettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY))
>
> Alle de fundne _personer_ skal nu slettes, hvordan gør jeg det?

Hvis du har en forespørgsel der returnerer nøglerne på noget der skal
slettes, kan du altid bruge en subselect...

DELETE FROM mintabel where id in (SELECT ...)

Mvh. Michael.

Peter (20-11-2008)
Kommentar
Fra : Peter


Dato : 20-11-08 17:38

"Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
news:492492e9$0$90275$14726298@news.sunsite.dk...
> Peter wrote:
>> Jeg har 2 tabeller. Personer som indeholder person oplysninger og kort
>> som indeholder kort oplysninger, hver person kan have mange kort.
>>
>> Kort status kan være 1 for udleveret eller 10 for slettet, jeg skal have
>> fundet de personer som ingen kort har eller kun har kort hvor status er
>> 10.
>> Hvis personer ingen kort har så skal oprettetdato for personen være ældre
>> end 90 dage
>> Hvis personer har kort så skal nyeste slettetdato for kortet være ældre
>> end 90 dage
>>
>> Denne SQL ser ud til at gøre lige det:
>>
>> SELECT personer.*, kort.*, min(kort.status) as minstatus,
>> max(kort.slettetdato) as maxslettetdato
>> FROM personer
>> left join kort on personer.idkode=kort.person
>> group by personer.idkode
>> having (kort.status is null and
>> personer.oprettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY)) or
>> (minstatus=10 and maxslettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY))
>>
>> Alle de fundne _personer_ skal nu slettes, hvordan gør jeg det?
>
> Hvis du har en forespørgsel der returnerer nøglerne på noget der skal
> slettes, kan du altid bruge en subselect...
>
> DELETE FROM mintabel where id in (SELECT ...)

Hvis jeg skriver således:

DELETE FROM personer where personer.idkode in (
SELECT personer.*, kort.*, min(kort.status) as minstatus,
max(kort.slettetdato) as maxslettetdato
FROM personer
left join kort on personer.idkode=kort.person
group by personer.idkode
having (kort.status is null and
personer.oprettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY)) or (minstatus=10
and maxslettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY))
)

får jeg fejlen: Operand should contain 1 column(s)

/P



Michael Zedeler (20-11-2008)
Kommentar
Fra : Michael Zedeler


Dato : 20-11-08 18:24

Peter wrote:
> "Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
> news:492492e9$0$90275$14726298@news.sunsite.dk...
>> Peter wrote:
>>> Jeg har 2 tabeller. Personer som indeholder person oplysninger og kort
>>> som indeholder kort oplysninger, hver person kan have mange kort.
>>>
>>> Kort status kan være 1 for udleveret eller 10 for slettet, jeg skal have
>>> fundet de personer som ingen kort har eller kun har kort hvor status er
>>> 10.
>>> Hvis personer ingen kort har så skal oprettetdato for personen være ældre
>>> end 90 dage
>>> Hvis personer har kort så skal nyeste slettetdato for kortet være ældre
>>> end 90 dage
>>>
>>> Denne SQL ser ud til at gøre lige det:
>>>
>>> SELECT personer.*, kort.*, min(kort.status) as minstatus,
>>> max(kort.slettetdato) as maxslettetdato
>>> FROM personer
>>> left join kort on personer.idkode=kort.person
>>> group by personer.idkode
>>> having (kort.status is null and
>>> personer.oprettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY)) or
>>> (minstatus=10 and maxslettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY))
>>>
>>> Alle de fundne _personer_ skal nu slettes, hvordan gør jeg det?
>> Hvis du har en forespørgsel der returnerer nøglerne på noget der skal
>> slettes, kan du altid bruge en subselect...
>>
>> DELETE FROM mintabel where id in (SELECT ...)
>
> Hvis jeg skriver således:
>
> DELETE FROM personer where personer.idkode in (
> SELECT personer.*, kort.*, min(kort.status) as minstatus,
> max(kort.slettetdato) as maxslettetdato
> FROM personer
> left join kort on personer.idkode=kort.person
> group by personer.idkode
> having (kort.status is null and
> personer.oprettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY)) or (minstatus=10
> and maxslettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY))
> )
>
> får jeg fejlen: Operand should contain 1 column(s)

Ja. Det er fordi resultatet fra din select kun skal returnere id'erne på
det, du vil slette.

Mvh. Michael.

Peter (20-11-2008)
Kommentar
Fra : Peter


Dato : 20-11-08 19:23

"Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
news:49259d22$0$90273$14726298@news.sunsite.dk...
> Peter wrote:
>> "Michael Zedeler" <michael@zedeler.dk> skrev i en meddelelse
>> news:492492e9$0$90275$14726298@news.sunsite.dk...
>>> Peter wrote:
>>>> Jeg har 2 tabeller. Personer som indeholder person oplysninger og kort
>>>> som indeholder kort oplysninger, hver person kan have mange kort.
>>>>
>>>> Kort status kan være 1 for udleveret eller 10 for slettet, jeg skal
>>>> have fundet de personer som ingen kort har eller kun har kort hvor
>>>> status er 10.
>>>> Hvis personer ingen kort har så skal oprettetdato for personen være
>>>> ældre end 90 dage
>>>> Hvis personer har kort så skal nyeste slettetdato for kortet være ældre
>>>> end 90 dage
>>>>
>>>> Denne SQL ser ud til at gøre lige det:
>>>>
>>>> SELECT personer.*, kort.*, min(kort.status) as minstatus,
>>>> max(kort.slettetdato) as maxslettetdato
>>>> FROM personer
>>>> left join kort on personer.idkode=kort.person
>>>> group by personer.idkode
>>>> having (kort.status is null and
>>>> personer.oprettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY)) or
>>>> (minstatus=10 and maxslettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY))
>>>>
>>>> Alle de fundne _personer_ skal nu slettes, hvordan gør jeg det?
>>> Hvis du har en forespørgsel der returnerer nøglerne på noget der skal
>>> slettes, kan du altid bruge en subselect...
>>>
>>> DELETE FROM mintabel where id in (SELECT ...)
>>
>> Hvis jeg skriver således:
>>
>> DELETE FROM personer where personer.idkode in (
>> SELECT personer.*, kort.*, min(kort.status) as minstatus,
>> max(kort.slettetdato) as maxslettetdato
>> FROM personer
>> left join kort on personer.idkode=kort.person
>> group by personer.idkode
>> having (kort.status is null and
>> personer.oprettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY)) or
>> (minstatus=10 and maxslettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY))
>> )
>>
>> får jeg fejlen: Operand should contain 1 column(s)
>
> Ja. Det er fordi resultatet fra din select kun skal returnere id'erne på
> det, du vil slette.

Jeg var nød til at lave en dobbelt subselect for at undgå bla. fejlen:
Unknown column 'kort.status' in 'having clause'

DELETE FROM personer WHERE idkode in (
SELECT idkode FROM (
SELECT personer.idkode, personer.oprettetdato, kort.status, min(kort.status)
as minstatus, max(kort.slettetdato) as maxslettetdato
FROM personer
left join kort on personer.idkode=kort.person
group by personer.idkode
having (kort.status is null and
personer.oprettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY)) or (minstatus=10
and maxslettetdato<DATE_SUB(CURDATE(),INTERVAL 90 DAY))
) as temp
)

Takker

/P



Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste