Команда SQL для объединения нескольких строк в одну ячейку?

#mysql #sql #database #oracle #relational-database

#mysql #sql #База данных #Oracle #реляционная база данных

Вопрос:

У меня есть таблица назначений групп пользователей, например:

 ID----UserName------Group
01    johnsmith     admin
02    sarahwilles   admin
03    johnsmith     testuser
  

Я хотел бы отобразить его как:

 UserName-------Groups
johnsmith      admin, testuser
sarahwilles    admin
  

Возможно ли это с помощью SQL?

Ответ №1:

Это не является частью стандартного SQL, потому что он настолько открытый, что его сложно решить таким образом, чтобы обеспечить предсказуемый ответ. Неограниченное количество строк в основном является нормальной и ожидаемой частью SQL, но текстовые строки неограниченной длины — нет. group_concat() существует в mysql, но для меня это обычно почти не соответствует моим требованиям. Это единственное, что он может, это усекать результаты, если они превышают системный предел, group_concat_max_len. Следовательно, все еще требуется дополнительный код для вычисления длины «реального» результата и проверки, длиннее ли это, чем group_concat_max_len . Конечно, у вас могут быть некоторые другие ограничения, которые гарантируют, что это не будет проблемой, но, скорее всего, это просто невероятно, а не невозможно, чтобы возникла проблема с превышением group_concat_max_len . Кроме того, это означает, что в какой-то момент вам нужно проверить значение group_concat_max_len в вашем коде, потому что оно настраивается и может измениться позже.

Почти в каждом случае, когда я когда-либо хотел использовать group_concat(), я в конечном итоге обнаружил, что мне лучше написать что-то, что могло бы работать со всеми значениями в строках, вместо объединения их в одну строку. Однако это может быть довольно удобно, если вы просто копаетесь в командной строке mysql>, исследуя свои данные.

Ответ №2:

Не в стандартном SQL, но MySQL ** предоставляет GROUP_CONCAT , который будет делать именно то, что вы хотите.

 SELECT foo, GROUP_CONCAT(DISTINCT bar ORDER BY bar) AS bars
FROM foo_table
LEFT JOIN bar_table ON bar_table.foo_id = foo_table.foo_id
  

** предполагая, что это нормально, поскольку вы отметили вопрос с mysql

Ответ №3:

ВЫБЕРИТЕ ОТДЕЛЬНОЕ имя пользователя, группу Из имя_таблицы

Ответ №4:

Попробуйте это:

 SELECT UserName, group_concat(group) allGroup
FROM tableAssignment
GROUP BY UserName
  

Надеюсь, это поможет.

Комментарии:

1. Добро пожаловать в stackoverflow. Пожалуйста, попробуйте прочитать предыдущие ответы перед публикацией. group_concat уже было предложено (и принято) более двух лет назад 😉