#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
уже было предложено (и принято) более двух лет назад 😉