dekros
6.09.2016, 16:30:28
Witam mam 3 tabele
USERS, pola name,uid(moje unikalne id)
PERM, value
PREMIUM, uid
(wypisałem tylko pola które mnie interesują)
i chce zrobić zapytanie typu select który pobierze mi wszystko userów z bazy USER których name nie ma w bazie PERM pod polem value oraz tych których uid nie znajduje sie w bazie PREMIUM.
próbowałem
SELECT * FROM users JOIN perm ON users.name != perm.value;
i niestety było tak że jeden user był pokazany tyle razy ile jest rekordów w tabeli perm;/
taki przykład
USERS
name = dekros uid=1231231123
name = test uid = 939293902
name = testowy uid = uid = 3213598003
PERM
value = dekros
PREMIUM
uid = 3213598003
i zapytanie powinno pokazać mi tylko gracza test bo znajduje sie tylko w tabeli USERS, gracza dekros nie bo jest w PERM a test tez nie bo jest w PREMIUM
trueblue
6.09.2016, 16:40:56
2x LEFT JOIN (pomiędzy USERS i PERM oraz USERS i PREMIUM)
w WHERE 2x IS NULL (na odpowiednie pola w PERM i PREMIUM).
dekros
6.09.2016, 16:53:13
Cytat(trueblue @ 6.09.2016, 17:40:56 )

2x LEFT JOIN (pomiędzy USERS i PERM oraz USERS i PREMIUM)
w WHERE 2x IS NULL (na odpowiednie pola w PERM i PREMIUM).
hmm a ten WHERE to zamiast ON mam dać? coś ala
SELECT * FROM users LEFT JOIN perm WHERE users.name = perm.value IS NULL;
? nie amm ajk sprawdzić bo na telefonie jestem teraz;/
trueblue
6.09.2016, 17:17:25
WHERE masz dać w WHERE.
javafxdev
6.09.2016, 20:54:21
Nie rób LEFT JOINa bo będziesz cierpiał jak będzie więcej danych, czemu tak jest?
Ponieważ optymizer SQL musi zrobić całego JOINA, a dopiero potem przefiltrować wyniki.
"That's why the LEFT JOIN / IS NULL query takes 2-3 times as much as the NOT EXISTS / NOT IN query."
Poszukaj opracowań w internecie czemu tak jest, jak jesteś ciekawy.
dekros
6.09.2016, 20:58:56
SELECT * FROM `user` LEFT JOIN perm ON perm.value != user.nick LEFT JOIN premium ON premium.uuid != user.uuid
zrobiłem takie coś niby udało się zapytanie ale i tak nie pokazuje mi rekordów jakbym chciał, tzn pokazuje tak jak z tabeli premium dane osób które tam sam niby są a ich nie ma
@javafxdev a co używac zamiast tego?
trueblue
6.09.2016, 21:39:32
Cytat(javafxdev @ 6.09.2016, 21:54:21 )

Nie rób LEFT JOINa bo będziesz cierpiał jak będzie więcej danych, czemu tak jest?
Ponieważ optymizer SQL musi zrobić całego JOINA, a dopiero potem przefiltrować wyniki.
"That's why the LEFT JOIN / IS NULL query takes 2-3 times as much as the NOT EXISTS / NOT IN query."
Poszukaj opracowań w internecie czemu tak jest, jak jesteś ciekawy.
To o czym piszesz tyczy się MSSQL Server. W przypadku MySQL użycie LEFT JOIN jest optymalizowane do NOT IN. A NOT EXISTS delikatnie wolniejsze.
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.