I am updating an old PHP script to use PDO, and I am having trouble duplicating the original behavior.
The problem appears to be related to a neat little feature of the IN comparison that does not work with strings.
Given this table:
CREATE TABLE `my_categories` (
`name` VARCHAR(255) NULL,
`categories` VARCHAR(255) NULL);
INSERT INTO my_categories (name, categories) VALUES
('Joe', '575'),
('Bob', '576'),
('Jim', '577'),
('Daisy','576,577'),
('Billy','576,597');
I can use this following SQL to match all the rows as required:
SELECT * as test FROM my_categories WHERE categories IN (575,576,577)
name categories
Joe 575
Bob 576
Jim 577
Daisy 576,577
Billy 576,597
However, with the slightest modification, Daisy and Billy are dropped from the results:
SELECT * as test FROM my_categories WHERE categories IN ('575','576','577')
Joe 575
Bob 576
Jim 577
My problem is that I cannot duplicate the results in the first test at all using prepared statements in PDO.
Why is the behavior different, how can I get that functionality from a prepared statement, and is there a better way to compare "dumb" comma separated lists in a way to match all the given test cases?
Mysql Fiddle: http://sqlfiddle.com/#!9/798faa/2