Du kommer att vilja ta en titt på MySQL:s find_in_set()
funktion:
SELECT
*
FROM
your_table
WHERE
NOT FIND_IN_SET(User.user_name, @valid_users);
För att detta ska fungera bör den kommaseparerade listan inte innehålla citattecken (såvida inte dina användarnamn faktiskt innehåller citattecken) och bör inte vara utfylld med mellanslag:
SET @valid_users := 'admin,jrock,kmicka,First Last';
För att direkt svara på din fråga om "varför skulle en variabel i NOT IN filter fungerar", beror det på att @valid_users behandlas som en sträng och när du skickar den till IN() , den behandlas som en enda sträng (dvs. inte en uppsättning/lista). Med FIND_IN_SET() , behandlar den strängen i @valid_users som en kommaseparerad uppsättning/lista och använder den därefter.