Ваш текущий запрос `SELECT * FROM todos GROUP BY completed ORDER BY id` неправильный, потому что вы используете `GROUP BY` с выборкой всех полей (`*`), что не разрешается в большинстве реляционных СУБД, таких как MySQL, PostgreSQL и т.д., если эти поля не указаны в `GROUP BY` или не включены в агрегатные функции (например, `COUNT()`, `MAX()`, `SUM()`).
Если вы хотите просто получить количество записей, которые `completed` и `not completed` для каждого пользователя, вы бы использовали что-то вроде этого:
```sql
SELECT user_id, completed, COUNT(*) as total
FROM todos
GROUP BY user_id, completed
ORDER BY user_id;
```
Этот запрос подсчитывает количество записей в `todos` для каждого пользователя, группируя их по `user_id` и по `completed`. `COUNT(*)` будет подсчитывать количество записей для каждой группы.
Если вы хотите получить список всех задач (todos), группированный по `completed` для каждого пользователя, вам потребуется использовать, например, JSON агрегацию (в PostgreSQL) или подобную функциональность в зависимости от вашей СУБД:
Для PostgreSQL это может выглядеть так:
```sql
SELECT user_id, completed, JSON_AGG(t.*) as tasks
FROM todos t
GROUP BY user_id, completed
ORDER BY user_id;
```
Здесь `JSON_AGG(t.*)` собирает все поля каждой записи в JSON массив для каждой группы.
Обратите внимание, что синтаксис может варьироваться в зависимости от используемой вами СУБД. Убедитесь, что вы используете синтаксис, который подходит для вашей конкретной системы управления базами данных.