Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] MultiDelete
Forum PHP.pl > Forum > Bazy danych > MySQL
eai
Witam,
jako że SQL nie jest moją najmocniejszą stroną mam problem z Usuwaniem rekordów z wielu tabel jednym zapytaniem.

  1. DELETE FROM `history`, `thumb`, `photos`, `images`,`group`
  2. USING `history`, `thumb`, `photos`, `images`, `group`
  3. WHERE `group`.`group_id` = 1 AND `images`.`img_group` = 1 AND `history`.`photo_id` = `photos`.`photo_id` AND `history`.`thumb_id` = `thumb`.`thumb_id` AND `photos`.`img_id` = `images`.`img_id` AND `thumb`.`photo_id` = `photos`.`photo_id`;


Problem polega na tym że MySQL nie usuwa żadnych rekordów (nie pokazuje też błędu)
Ten Delete ma usuwać określone pola z tabel:
Kod
`history`, `thumb`, `photos`, `images`,`group`


Tabele wyglądają tak:
group
Kod
group_id | group_name|...

images
Kod
img_id|group_id|...

photos
Kod
photo_id|img_id|...

thumbs
Kod
thumb_id|photo_id

history
Kod
history_id|photo_id|thumb_id|...

Jeśli chodzi o tabelę history w jednej pozycji jest albo photo_id albo thumb_id nigdy jednocześnie

Cała operacja ma wyglądać tak że usuwam wszystko o group_id i kolejno wszystkie rekordy z tych tabel ktore naleza do tej grupy. Group zawiera images, images zawierają photos, photos zawierają thumbs a history zawiera kopie thumbs lub photos.
Kod
group
  |
images
  |
photos  \
  |       history
thumbs  /


Czy da się jednym zapytaniem usunąć rekordy?
Bo robienie kilku selektów i pętl strasznie obciązy serwer.
Norbas
Sprawdź czy jeśli zrobisz SELECT * zamiast DELETE, to czy otrzymasz jakieś wyniki
kwiateusz
i spróbuj wywalić USING
eai
Problem wykryty:
Problemem jest tabel history która zawiera pola photo_id oraz thumb_id,
po usunięciu tej tabeli z zapytania DELETE wszystko zgodnie z planem się usuwa.
Ale zrobiłem jeszcze że usunalem pole thumb_id i zostalo samo photo_id w history. I też działa.

Pytanie:
Czy muszę zrobic teraz dwie tabele history_thumb i history_photos? Czy coś źle robie w moim zapytaniu??
Norbas
Sprawdź:
  1. DELETE FROM `history`, `thumb`, `photos`, `images`,`group`
  2. WHERE `group`.`group_id` = 1 AND `images`.`img_group` = 1 AND ((`history`.`photo_id` = `photos`.`photo_id`) OR (`history`.`thumb_id` = `thumb`.`thumb_id`)) AND `photos`.`img_id` = `images`.`img_id` AND `thumb`.`photo_id` = `photos`.`photo_id`;

Powinno działać, gdy są odpowiednie rekordy w połączonych tabelach. Jeżeli nie ma odpowiednich rekordów we wszystkich tabelach, to moim zdaniem powinieneś zastosować LEFT JOIN, a nie zwykłe złączenia
eai
Dzięki waszym wskazówkom doszedłem do rozwiązania problemu:

  1. DELETE FROM imagefx_history USING imagefx_history,imagefx_thumb,imagefx_photos,imagefx_images
  2. WHERE imagefx_images.img_group = 1 AND imagefx_photos.img_id = imagefx_images.img_id AND ( imagefx_history.photo_id = imagefx_photos.photo_id OR ( imagefx_thumb.photo_id = imagefx_photos.photo_id AND imagefx_history.thumb_id = imagefx_thumb.thumb_id));


  1. DELETE FROM imagefx_thumb USING imagefx_thumb, imagefx_photos, imagefx_images WHERE imagefx_images.img_group = 1 ANDimagefx_photos.img_id = imagefx_images.img_id AND imagefx_thumb.photo_id = imagefx_photos.photo_id;


  1. DELETE FROM imagefx_photos USING imagefx_photos,imagefx_images WHERE imagefx_images.img_group = 1 AND imagefx_photos.img_id = imagefx_images.img_id;


  1. DELETE FROM imagefx_images WHERE imagefx_images.img_group = 1;


  1. DELETE FROM imagefx_group WHERE group_id = 1;


Niestety muszę wykonać 5 Zapytań. Jestem tylko Ciekaw jak będzie wyglądało obciążenie przy sporej ilości danych....
SongoQ
Albo wykorzystaj kaskadowe usuwanie bedziesz mial 1 zapytanie ale i tak wydajnosc jest ta sama.
eai
Kaskadowe?? Co masz na myśli?
Próbowałem w jednym zapytaniu ale się nie udało ponieważ wszystkie warunki muszą być spełnione.
dla DELETE nie moge uzywac podzapytan(select) już próbowałem.

Jak masz pomysł to napisz swój kod, a na pewno przetestuje smile.gif
Norbas
Jak widzę zmieniłeś nazwy tabel. Sprawdź:
  1. DELETE imagefx_history,imagefx_thumb,imagefx_photos,imagefx_images,imagefx_group
  2. FROM imagefx_group LEFT JOIN imagefx_images ON imagefx_images.img_group=imagefx_group.group_id
  3. LEFT JOIN imagefx_photos ON imagefx_photos.img_id=imagefx_images.img_id
  4. LEFT JOIN imagefx_thumb ON imagefx_thumb.photo_id=imagefx_photos.photo_id
  5. WHERE imagefx_group.group_id=1
SongoQ
@eai Majac relacje w bazie i powiazanie caskadowe usuwajac nadrzedny rekord w Twoim przypadku grupe usuwa automatycznie reszte rekordow.
eai
Jak stworzyć taką relację w PhpMyAdmin ?
SongoQ
Polecam jak zawsze manual. http://dev.mysql.com/doc/refman/5.1/en/inn...onstraints.html
eai
Fajna sprawa. Jak zawsze za pomoc ślicznie dziękuje smile.gif
Pozdrawiam.
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.