You said "it works with the hashref", which I gather means you get the right answer when you do:
my $href = $d->selectall_hashref( ... );
If that's true, then maybe you haven't shown all the relevant code. In particular, after you call $d->selectrow_array(...)
how many other things happen before you notice that $max is undef? And do any of those things involve $max (in ways that might cause it to become undef)?
(UPDATE: I should point out that I use DBI and Mysql on OSX, and the "selectrow_array" call works for me when I do the equivalent type of query and list assignment on one of my databases.)