SELECT * FROM list ORDER BY pos LIMIT 3
If there's an index on pos, there's no cost to the sort.
If there's an index on pos, there's no cost to the sort.
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.
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.