Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Usunięcie wierszy bez powiązania
Forum PHP.pl > Forum > Przedszkole
@rtur
Mam 2 tabele artist i songs

  1. -- --------------------------------------------------------
  2.  
  3. --
  4. -- Struktura tabeli dla tabeli `Artists`
  5. --
  6.  
  7. CREATE TABLE IF NOT EXISTS `Artists` (
  8. `ArtistID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  9. `ArtistName` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  10. PRIMARY KEY (`ArtistID`),
  11. UNIQUE KEY `ArtistName` (`ArtistName`)
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=17108 ;
  13.  
  14. -- --------------------------------------------------------
  15.  
  16. --
  17. -- Struktura tabeli dla tabeli `Songs`
  18. --
  19.  
  20. CREATE TABLE IF NOT EXISTS `Songs` (
  21. `SongID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  22. `SongTitle` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  23. `ArtistID` int(10) UNSIGNED NOT NULL,
  24. PRIMARY KEY (`SongID`),
  25. UNIQUE KEY `Title` (`SongTitle`,`ArtistID`),
  26. KEY `ArtistID` (`ArtistID`)
  27. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=5429 ;
  28.  
  29. --
  30. -- Ograniczenia dla tabeli `Songs`
  31. --
  32. ALTER TABLE `Songs`
  33. ADD CONSTRAINT `Songs_ibfk_1` FOREIGN KEY (`ArtistID`) REFERENCES `Artists` (`ArtistID`) ON UPDATE CASCADE;


W jaki sposób szybko usunąć z tabeli Artists tych artystów których ID nie figuruje w tabeli Songs
Comandeer
Kod
DELETE FROM Artists WHERE ArtistID IN (SELECT * FROM (…) AS todel)

W miejsce wielokropka należy wstawić ładne zapytanie pobierające tylko te id usera, które nie występują w Songs (hint: IN można zaprzeczyć)

Sposób działa, jest "szybki" z punktu widzenia kombinowania, ale za jego wydajność na polu bitwy nie ręczę - jest po prostu przekombinowany. Na pewno istnieje jakiś łatwiejszy.
prz3kus
  1. DELETE a
  2. FROM Artists a
  3. LEFT JOIN Songs s ON a.SongID =s.id
  4. WHERE s.id = null

Jakoś takoś też ma szansż zadziałac smile.gif
mmmmmmm
LEFT JOIN z NULLem
aniolekx
  1. DELETE FROM Artists
  2. LEFT JOIN Songs
  3. ON Artists.ArtistID = Songs.ArtistID
  4. WHERE Songs.ArtistID IS NULL
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.