Przyjrzyj się find_in_set()
funkcja:
SELECT
*
FROM
your_table
WHERE
NOT FIND_IN_SET(User.user_name, @valid_users);
Aby to zadziałało, lista rozdzielana przecinkami nie powinna zawierać cudzysłowów (chyba że nazwy użytkownika faktycznie zawierają cudzysłowy) i nie powinna być uzupełniona spacjami:
SET @valid_users := 'admin,jrock,kmicka,First Last';
Aby bezpośrednio odpowiedzieć na Twoje pytanie dotyczące „dlaczego zmienna w NOT IN
filtr działa", to dlatego, że @valid_users
jest traktowany jako ciąg znaków i kiedy przekazujesz go do IN()
, jest traktowany jako pojedynczy ciąg (tzn. nie zestaw/lista). Za pomocą FIND_IN_SET()
, traktuje ciąg w @valid_users
jako zestaw/listę oddzielonych przecinkami i używa ich odpowiednio.