Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mySQL] Wybór rekordów z tabeli A ale tylko tych które nie istnieją w tabeli B
Forum PHP.pl > Forum > Bazy danych > MySQL
yalus
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
alegorn
to tak w najprostszy sposob...:

  1. SELECT id FROM a WHERE id NOT IN (SELECT id FROM b)
Mchl
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
alegorn
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;


Mchl
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
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.