Rafał Kiełbus

Rafał Kiełbus #blockchain
developer, #bitcoin
maximalist,
#ethereum mage

Temat: [MySql] Czy można inaczej? Select ... where not in...

Witam.
Chodzi o wybranie rekordów z tablicy których element nie występuje w innej: np. wybranie klientów którzy nie dokonali jakiegoś zakupu.
Robię to zapytaniem:
select ludzie.myid, imie, nazwisko from ludzie, zakup where
ludzie.myid=zakup.myid
and ludzie.myid not in (select id_platnik from zakup);


Tabela ludzie zawiera unikalny myid i dane kupującego a tabela zakup zawiera zakupy w parach kto-co (i parę innych rzeczy ;]).

Boję się, że z czasem może się to dość długo wykonywać...Rafał Kiełbus edytował(a) ten post dnia 29.11.09 o godzinie 21:44
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: [MySql] Czy można inaczej? Select ... where not in...


select ludzie.myid, imie, nazwisko
from ludzie
join zakup zak on (ludzie.myid=zakup.myid)
left join zakup wykluczenie on (ludzie.myid = wykluczenie.id_platnik)
where
wykluczenie.id_platnik IS NULL


Nie jest jednak pewnikiem, że to zapytanie będzie szybsze niż Twoje. Musisz sobie porównać plany zapytań.
Rafał Kiełbus

Rafał Kiełbus #blockchain
developer, #bitcoin
maximalist,
#ethereum mage

Temat: [MySql] Czy można inaczej? Select ... where not in...

Hmm?
Założyć osobną tabelę z której usuwać IDy tych co wykonali zakup a przy rejestracji ich dopisywać? Bo chyba tą rolę ma spełniać tabela "wykluczenie" ?
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: [MySql] Czy można inaczej? Select ... where not in...

Rafał Kiełbus:
Hmm?
Założyć osobną tabelę z której usuwać IDy tych co wykonali zakup a przy rejestracji ich dopisywać? Bo chyba tą rolę ma spełniać tabela "wykluczenie" ?

"wykluczenie" jest tylko aliasem na tabelę "zakup".

Dane z "select id_platnik from zakup" zostały przeniesione do left joina, a że już wcześniej korzystałeś z tej tabeli to musiałem jej nadać jakikolwiek alias.
Łukasz Schabek

Łukasz Schabek Architekt Rozwiązań

Temat: [MySql] Czy można inaczej? Select ... where not in...


select ludzie.myid, imie, nazwisko from ludzie, zakup where
ludzie.myid=zakup.myid
and not exists (
select 1 from zakup where ludzie.myid = id_platnik
)

Boję się, że z czasem może się to dość długo

Jeśli zastosujesz IN, to na pewno nie wykona się zbyt szybko. IN to tak naprawdę zakamuflowane OR'y :)Łukasz Schabek edytował(a) ten post dnia 30.11.09 o godzinie 09:14

konto usunięte

Temat: [MySql] Czy można inaczej? Select ... where not in...

Rafał Kiełbus:
Witam.
Chodzi o wybranie rekordów z tablicy których element nie występuje w innej: np. wybranie klientów którzy nie dokonali jakiegoś zakupu.
Robię to zapytaniem:
select ludzie.myid, imie, nazwisko from ludzie, zakup where
ludzie.myid=zakup.myid
and ludzie.myid not in (select id_platnik from zakup);

Rozwiazanie nr 1 (denormalizacja widoczna)

select ludzie.myid, imie, nazwisko from ludzie where
ludzie.myid and ludzie.ostatni_zakup is null
-- ostatni_zakup aktualizowany po kazdym zakupie, wymaga indeksu
-- bez indeksu - pelen skan, ale bez szukania w drugiej tabeli


Rozwiazanie nr 2 (denormalizacja wtorna)

select ludzie.myid, imie, nazwisko from ludzie where
ludzie.myid and ludzie.myid in (select myid from
ludzie_bez_zakupow)
-- ludzie_bez_zakupow aktualizowany po kazdym zakupie,
-- zawiera id ludzi tylko jesli ludz nie ma jeszcze zakupow


Z tego co pamiętam jest jakiś problem w MySQL z podzapytaniami - w starszych wersjach. Najlepiej popróbować z EXPLAIN.



Wyślij zaproszenie do