webForumDet fria alternativet

MySQL: Delete från select...

Databaser & SQLur Databashanterare & SQL

6 svar · 490 visningar · startad av desdecado

desdecadoMedlem sedan juli 2004206 inlägg
#1

Har sökt i online-manualen men hittar inte om det i MySQL går att göra en delete på resultatet ifrån en select-sats, alltså något i stil med:

DELETE FROM tabell WHERE EXISTS (SELECT * FROM tabell WHERE... bla bla bla)

???

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Jo, om du har version 4.1 eller senare.

@ndersMedlem sedan juni 200032 969 inlägg
#3

Det beror lite på vilken version av MySQL man använder, eftersom tidigare versioner än 4.1 inte stödjer subqueries.

Generellt sett skulle jag nog ha gjort så här:

DELETE FROM foo WHERE ID IN (SELECT fooid FROM bar)

Mvh

desdecadoMedlem sedan juli 2004206 inlägg
#4

(jag har version 4.1.12)

Jag får tyvär error när jag försöker använda en select på samma tabell som jag vill radera. Syntaxen jag använder är:

delete from ds_search_history
where exists (select *
                    from ds_search_history as t
                    where t.search_keyword = ds_search_history.search_keyword
                    and    t.search_timestamp < ds_search_history.search_timestamp)

..jag testade givetvis även din variant, @nders, men det verkar inte fungera. Vad jag egentligen försöker göra är att radera alla dubletter men spara en av posterna. Select-satsen plockar ut alla dessa dubletter som jag vill ha bort.

LarsGMedlem sedan dec. 200012 464 inlägg
#5

Mysql har någon begränsning i det att man kan inte ange den tabell man gör delete på i subselecten om jag inte missminner mig.

Det alternativ som står till städes torde då vara att förfara enligt följande

create temporary table t as 
 select <kolumner>,min(search_timestamp)
from ds_search_history
group by <kolumner>

delete from ds_search_history

insert into ds_search_history 
select * from t

Med <kolumner> avses alla kolumner utom search_timestamp

Du får kontrollera syntaxen för att skapa en tabell med hjälp av select då Mysql ej följer standard i detta avseende.

desdecadoMedlem sedan juli 2004206 inlägg
#6

Tack för hjälpen, jag ska kolla upp om det fungerade senare under dagen. Själv har jag kört MS SQL i mååånga år och där är det bara att tuta och köra. =)

desdecadoMedlem sedan juli 2004206 inlägg
#7

Nice, det fungerade, men jag kunde tydligen inte göra en temptabell så det fick bli en "vanlig" istället... :)

Tackar och bockar!

134 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)