Ah, ok, I misread. Yeah, that requires a subquery then, but not because of floats being unsuitabe for sorting, but because you're doing a 1-to-many thingy in a 1-to-1 way by hardcoding 3 columns. It's like writing
items[0].text + items[1].text + items[2].text
In code to simplify it, instead of items.slice(0,2).map((e) => e.text).concat('');
The former mostly works, but it's definitely not elegant. And you have to be sure the number of items being 3 is set in stone.
Now I want a full select of those 800 users with their first three to-do items in neat columns next to the user.
Your select doesn't do that.