Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Usuwanie na podstawie id z innej tabeli
Forum PHP.pl > Forum > Bazy danych
bmL
Witam, nie wiem jak zrobić takie zapytanie (czy ono jest w ogóle możliwe) mianowicie:
Mam sobie 2 tabele:
1:
Kod
OtherID // mainID // inne...
1 // 2 // inne
2 // 5 // inne
3 // 2 // inne
4 // 6 // inne
5 // 6 // inne
7 // 2 // inne
itp...
Pole mainID może się powtarzać

Następnie mam tabele nr 2:
Kod
OtherID // inne...
1 // inne
3 // inne
4 // inne
5 // inne
... itp

Teraz jako dane wejściowe mam jedno MainID i chciałbym jednym zapytaniem:
- pobrać wszystkie otherID z tabeli nr 1 których mainID zgadza się temu danemu
- usunąć wszystkie wpisy z tabeli nr2 ktorych otherID jest równe tym pobranym z tabeli nr1

Czy da się zrobić to jednym zapytaniem?
kefirek
Chyba o takie coś chodzi
  1. DELETE FROM test1 WHERE twojeID IN (SELECT OtherID FROM test);
bmL
Dzięki podążając za rzuconym mi tropem doszedłem do takiej wiadomości:

Cytat(Martin @ July 4 2008 12:57pm on http://dev.mysql.com)
I found a fast way to delete a small subset of rows in a very big table (hundreds of thousands or millions):

You will need the to be deleted IDs in a temporary table which you might already have and you want to delete only those IDs:

A naive way would be to do

DELETE FROM LargeTable WHERE ID IN (SELECT ID FROM TemporarySmallTable);

Given that LargeTable contains maybe 300,000-500,000 and
TemporarySmallTable ca 3,000-6,000 rows, this can take ca 300ms.

Instead, try this:

DELETE FROM LargeTable USING LargeTable INNER JOIN TemporarySmallTable ON LargeTable.ID = TemporarySmallTable.ID;

This DELETE takes on the same database 1ms.

The trick is, that INNER JOIN will 'shrink' the LargeTable down to the size of the TemporarySmallTable and the delete will operate on that smaller set only, since USING will reference to the joined table.


Tuta pisze w skócie, że zastosowanie INNER JOIN jest o wiele szybsze (jeżeli dobrze zrozumiałem) będę podążał za tym wzorcem chociaż nie mam zamiaru jak na razie sprawdzać jego wydajności smile.gif
melkorm
Prawda. Dziwie się że nikt nie wykazał się napsianie DELETE'a z JOINEM :]

No ale cóż bywa xp

P.S. jako że wkleiłeś przykład to wyszedłem z założenia że nie trzeba już psiać Tobie tego zapytania ;]
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.