Você vai querer dar uma olhada no
find_in_set()
função:SELECT
*
FROM
your_table
WHERE
NOT FIND_IN_SET(User.user_name, @valid_users);
Para que isso funcione, a lista separada por vírgulas não deve conter aspas (a menos que seus nomes de usuário realmente contenham aspas) e não deve ser preenchida com espaços:
SET @valid_users := 'admin,jrock,kmicka,First Last';
Exemplo do SqlFiddle
Para responder diretamente à sua pergunta sobre "por que uma variável no
NOT IN
filtro funciona", é porque @valid_users
está sendo tratado como uma string e quando você a passa para IN()
, está sendo tratado como uma única string (ou seja, não um conjunto/lista). Com FIND_IN_SET()
, ele trata a string em @valid_users
como um conjunto/lista separado por vírgulas e usa-o de acordo.