Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Usuwanie na podstawie id z innej tabeli, Problem
bmL
post
Post #1





Grupa: Zarejestrowani
Postów: 301
Pomógł: 25
Dołączył: 15.07.2007
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
kefirek
post
Post #2





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

Ostrzeżenie: (0%)
-----


Chyba o takie coś chodzi
  1. DELETE FROM test1 WHERE twojeID IN (SELECT OtherID FROM test);


Ten post edytował kefirek 7.01.2009, 19:43:42
Go to the top of the page
+Quote Post
bmL
post
Post #3





Grupa: Zarejestrowani
Postów: 301
Pomógł: 25
Dołączył: 15.07.2007
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
melkorm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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 ;]
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 20:29