One possibility is to ORDER BY SUBSTRING_INDEX(position, '|', -1). To fetch out the state it would be SUBSTRING(position,'|,1). The column bit will be hairier.
It could also be done in PHP itself, using usort() and maybe create_function(), but that requires all the blocks you'll be sorting being read into the one array so that PHP can sort them.
An alternative PHP solution still requires reading in all the blocks, but identifying their position first, calling it $position, and then shovelling the block specification into an array element $blocks[$position].
But ultimately I still think you'd be happier rethinking the database structure; having a "block" table with fields (id,userid,state,column,position) and reducing user to (id,user) and whatever additional fields you keep. If your users are [id,user]=[1,tom][2,dick][3,harry] then harry's blocks can be found with 'SELECT * FROM blocks WHERE userid=3 ORDER BY position'. Consider what would happen otherwise if you wanted to have the blocks colour-coded...