Как сгруппировать данные запроса на основе внешних данных?

Доброго дня.
Есть таблица со списком ID юзеров (кроме ID там ничего нет, таблица связующая). При выборке эти айдишники выдаются. Но, у одного юзера может быть несколько ID (так устроена система). В таблице никак не отражено (и не может быть отражено), что у такого-то ID есть алиасы, поэтому я могу только передать все связи между ID на этапе построения запроса.

Собственно, цель: нужно получить агрегированное по полю значение из таблицы на основе переданных скалярных значений.

Грубо говоря, в таблице есть юзеры 123, 456, 789. Как составить запрос так, чтобы, явно передав в запросе значения 123 и 789 получить агрегацию по полю, например, users.count для этих двух строк? Что-то вроде GROUP_BY (users.id = 123 OR users.id = 789).

Буду благодарен за наводку на решение. Иными средствами решить, увы, нельзя, система очень костыльная - гребем, как можем.
  • Вопрос задан
  • 47 просмотров
Пригласить эксперта
Ответы на вопрос 2
@galaxy
Сложно предложить хорошее решение, не видя запроса, но, допустим, можно сконструировать промежуточную таблицу через values. Т.е. что-то типа такого:

SELECT ...
  FROM table1 JOIN table2 ...
  JOIN (
    VALUES (123, ARRAY[123, 789]),
           (345, ARRAY[345])
  ) t (id, aliases) ON (table1.userid = ANY(t.aliases))
 ...


Рабочий (вроде) пример:
SELECT t.id, string_agg(tt.data, ',')
  FROM 
  (
    VALUES (123, 'a'),
           (123, 'aa'),
           (789, 'b'),
           (345, 'c'),
           (345, 'd')
  ) tt (userid, data)
  JOIN
  (
    VALUES (123, ARRAY[123, 789]),
           (345, ARRAY[345])
  ) t (id, aliases) ON (tt.userid = ANY(t.aliases))
 GROUP by t.id
Ответ написан
Комментировать
@Vitsliputsli
Но, у одного юзера может быть несколько ID (так устроена система).

Значит это не id юзера. Сделайте реальное id юзера и указывайте его в ваших алиасах. Далее группируйте по реальному id юзера. Либо сделайте таблицу соответствия и группируйте через нее.

Что-то вроде GROUP_BY (users.id = 123 OR users.id = 789).

Это хардкод. Если сейчас вы и решите текущую задачу таким образом, далее будут большие проблемы из-за подобного подхода.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы