Схема базы:
1. Id (int) индекс записи
2. Position (int) номер пользователя в группе 1,2,3...
3. Uid пользователя
4. Группа(str)
5. Является основной группой (int 0/1)
Примечание: пользователь может находится в разных группах. Но только одна может быть выбрана основной
Записи в базе предварительно сгруппированы:
Записи идущие подряд идут с позиции 1, потом 2..., относятся к одной группе. Потом другая группа позиционирование с 1 и тд
Задача: получить все записи(* со всеми столбцами) по критерию группы..
И
Добавить столбец или отдельным массивом такой пункт: 0/1 если у пользователя выбрана любая другая основная группа
Какой вариант решения будет эффективным?
Есть вариант использовать create_function и там делать запрос по каждому пользователю. Но звучит как костыль.
select user_id, sum(is_base) has_base_grp from users group by user_id having sum (case when group_id = :критерий then 1 else 0 end) > 0
ну или self join, если индексы есть
Были неточности в моей изначальной формулировке. Исправил выше. Основная неточность: нужно выводить все записи по критерию группы, не меняя последовательности. Лишь добавить ещё один столбец или отдельным массивом все получить. Будут идеи?
Обсуждают сегодня