Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mySQL] Wybór rekordów z tabeli A ale tylko tych które nie istnieją w tabeli B
yalus
post 12.03.2010, 13:11:37
Post #1





Grupa: Zarejestrowani
Postów: 281
Pomógł: 0
Dołączył: 8.07.2005
Skąd: EU

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


Witam,

Mam oto takie zagadnienie:
w bazie mam dwie tabele A i B w kazdej z nich jest pole 'numer'. W tabeli A jest rekordów 500 a w tabeli B rekordów jest 700.
w A rekordy sa numerowane od 1do500 a w B od 1do700 i teraz chcialbym wybrac z tabeli B tylko te 200 które nie istnieja w tabeli A.

aby wybrać te same rekordy musiał bym napisać
  1. SELECT * FROM A,B WHERE A.numer=B.numer


a jak napisać zapytanie aby wybrać z B tylko te które nie znajdują sie w tabeli A?


pozdrawiam


--------------------
człowiek nie sznurek wszystko wytrzyma
Go to the top of the page
+Quote Post
alegorn
post 12.03.2010, 13:49:57
Post #2





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

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


to tak w najprostszy sposob...:

  1. SELECT id FROM a WHERE id NOT IN (SELECT id FROM b)


Ten post edytował alegorn 12.03.2010, 13:50:26
Go to the top of the page
+Quote Post
Mchl
post 12.03.2010, 15:11:30
Post #3





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


a to tak w wydajny sposób

Kod
SELECT a.*
FROM
a
LEFT JOIN
b
ON
a.numer = b.numer
WHERE
b.numer IS NULL
Go to the top of the page
+Quote Post
alegorn
post 25.03.2010, 11:50:40
Post #4





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

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


Mchl::zastanowlio mnie czy rzeczywiscie twoj sposob jest wydajniejszy... na logike, jesli brac pod uwage ilosc operacji jakie trzeba wykonac, na to by nie wskazywal, to chyba by byla kwestia lepszej lu gorszej implementacji danego polecenia w core bazy danych.

jednak nadal polemizowalbym ze to jest wydajniejszy sposob.... wg mnie koszt jest porownywalny, ja sprawdzalem na tabelach po ok 20000 rekordow - czasy wykonania byly niemal identyczne....

czytelnosc - kwestia gustu.. dla mnie wydaje sie wygodniejsze podzapytanie w tym przypadku


  1. EXPLAIN SELECT id FROM a WHERE id NOT IN (SELECT id FROM b);
  2. EXPLAIN SELECT a.* FROM a LEFT JOIN b ON a.id = b.id WHERE b.id IS NULL;


Go to the top of the page
+Quote Post
Mchl
post 25.03.2010, 16:02:13
Post #5





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


http://dev.mysql.com/doc/refman/5.1/en/opt...subqueries.html
http://dev.mysql.com/doc/refman/5.1/en/rew...subqueries.html

Taki sposób jest wydajniejszy w ogólności. W szczególnym przypadku nie musi być.
W tym konkretnym akurat nie ma narzuconych dodatkowych warunków na rekordy tabeli b w zależności od tabeli a. (np FROM b WHERE b.data = a.data) Gdyby takowe były, to podzapytanie wykonywałoby się dla każdego wiersza tabeli a.

Od wersji 5.4 optymizator sam potrafi (podobno) takie podzapytanie zoptymalizować, więc już nie będą potrzebne takie sztuczki

Ten post edytował Mchl 25.03.2010, 16:03:54
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 31.07.2025 - 08:56