@ActID
- это строковый литерал списка через запятую, а не список значений. Таким образом, список в скобках оператора IN
содержит только 1 значение: '5,15'
- при сравнении
5
с '5,15'
результат равен TRUE
- при сравнении
15
с '5,15'
результат равен FALSE
, поскольку '5,15'
преобразуется в целочисленное значение 5
в соответствии с правилами, описанными здесь . Вам нужна функция FIND_IN_SET()
:
SET @ActID = CONCAT(CAST(5 AS CHAR),',',CAST(15 AS CHAR));
SELECT * FROM `accounts` WHERE FIND_IN_SET(`ID`,@ActID) > 0;
Измените на ...= 0
для эквивалента NOT IN
. См. Упрощенную демоверсию . Примечание: SET @ActID = CONCAT(5,',',15);
работает нормально.