Задать вопрос

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

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

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

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

Буду благодарен за наводку на решение. Иными средствами решить, увы, нельзя, система очень костыльная - гребем, как можем.
  • Вопрос задан
  • 47 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 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).

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

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

Похожие вопросы