webForumDet fria alternativet

where not exists för ver 4.0.24

Databaser & SQL

1 svar · 475 visningar · startad av chha33

Medlem sedan juli 20065 inlägg
Frågan#1

Hej jag vill ta bort rader i tabellen netgym_smshist där netgym_smshist.medlemmarID saknas i netgym_medlemmar.ID (dvs medlemmar som tagits bort). Detta fungerar ej:

DELETE FROM netgym_smshist WHERE NOT EXISTS (SELECT * FROM netgym_medlemmar WHERE netgym_medlemmar.ID = netgym_smshist.medlemmarID)

(Har även prövat med WHERE NOT IN)

Antar eftersom jag använder mySQL 4.0.24?

Nån som har motsvarande SQL-sats som fungerar i denna version?

Tack.

Medlem sedan aug. 20039 340 inlägg
#2

Detta bör funka, men se för säkerhets skull till att göra en backup innan ifall jag tänkte fel!

DELETE FROM netgym_smshist 
LEFT JOIN netgym_medlemmar ON netgym_medlemmar.ID = netgym_smshist.medlemmarID
WHERE netgym_medlemmar.ID IS NULL;

Logiken är följande: LEFT JOIN joinar in alla rader från netgym_medlemmar där ID matchar, men LEFT JOIN tillåter till skillnad från en (INNER) JOIN att rader från netgym_smshist väljs även om ingen matchning finns för den raden. I de fallen får netgym_medlemmar.ID värdet null, och det används i WHERE-kriteriet för att filtrera fram de rader som saknar motsvarand medlems-ID.

294 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
162 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
159 ms — ändringar (db)