#php #mysql #join #group-by #group-concat
Вопрос:
У меня возникли проблемы с concat для этого оператора MYSQL.Данные выглядят следующим образом:
> ID: 60abae122046b578881656e1, User: Admin, Server: localhost.local
> ID: 60abae122046b578881656e1, User: Admin, Server: Test Device
> ID: 60aed69a89eb406cd6eaaf89, User: Steve Madden, Server: wpdesktop01
> ID: 60d09c2990d1887919cc8aff, User: Stu Hope, Server: pf-us1-smd
> ID: 60d09c2990d1887919cc8aff, User: Stu Hope, Server: pfv-us1-smd
> ID: 5d826b16827c0805683af8f5, User: test, Server: pf-us1-ansible
> ID: 5d826b16827c0805683af8f5, User: test, Server: pf-us1-dmz-sftp
> ID: 5c9b585c235ec76b0161c648, User: Rodrigo, Server: pf-us1-dev
> ID: 5c9b585c235ec76b0161c648, User: Rodrigo, Server: pf-us1-ansible
> ID: 5c9b585c235ec76b0161c648, User: Rodrigo, Server: pf-us1-zabbix
> ID: 5c9b585c235ec76b0161c648, User: Rodrigo, Server: pf-us1-sm
Идея в том, чтобы все выглядело так:
> ID: 60abae122046b578881656e1, User: Admin, Server: localhost.local, Test Device
> ID: 60aed69a89eb406cd6eaaf89, User: Steve Madden, Server: wpdesktop01
> ID: 60d09c2990d1887919cc8aff, User: Stu Hope, Server: pf-us1-smd, pfv-us1-smd
> ID: 5d826b16827c0805683af8f5, User: test, Server: pf-us1-ansible, pf-us1-dmz-sftp
> ID: 5c9b585c235ec76b0161c648, User: Rodrigo, Server: pf-us1-dev, pf-us1-ansible, pf-us1-zabbix, pf-us1-sm
Мое нынешнее заявление выглядит так:
$sql_modal = 'SELECT
pf_jc_user_audit.jc_id,
pf_jc_user_audit.jc_user,
pf_jc_user_server_ass.system_id,
pf_jc_servers.hostname
FROM
pf_jc_user_audit,
pf_jc_user_server_ass, pf_jc_servers
WHERE
pf_jc_user_audit.jc_id = pf_jc_user_server_ass.jc_id_ass and pf_jc_user_server_ass.system_id = pf_jc_servers.system_id';
Я пытался внести поправки с:
group_concat(pf_jc_servers.hostname)
и затем:
group by pf_jc_user_audit.jc_id
Но не повезло, есть какие-нибудь идеи?
Ответ №1:
Во-первых, используйте правильные соединения с ON
предложениями и псевдонимами для таблиц, чтобы сократить код и сделать его более читабельным.
Затем сгруппируйтесь по jc_id
и jc_user
:
SELECT ua.jc_id, ua.jc_user,
GROUP_CONCAT(s.hostname) AS hostname
FROM pf_jc_user_audit ua
INNER JOIN pf_jc_user_server_ass us ON ua.jc_id = us.jc_id_ass
INNER JOIN pf_jc_servers s ON us.system_id = s.system_id
GROUP BY ua.jc_id, ua.jc_user
Комментарии:
1. Это здорово, приближает меня. Однако я больше не могу получить доступ к элементу «имя хоста» из таблицы pf_jc_servers.system_id (s.system_id) и colomn
2. @user2720970 Я не вижу system_id в ваших образцах данных и ожидаемых результатах. Разве имя хоста не является столбцом, который вы хотите объединить с помощью GROUP_CONCAT()? Что вы имеете в виду, когда говорите, что я не могу получить доступ к «имени хоста» ?
3. Пример данных есть, например: localhost.local, Тестовое устройство и т. Д., Но да, имя хоста-это столбец в pf_jc_servers
4. @user2720970 мой запрос возвращает 3 столбца: jc_id, jc_user и агрегированные имена хостов, как и желаемый результат. Разве это не то, чего ты хочешь?
5. Это именно то, что я хочу, однако, это то, что я получаю: Идентификатор: 5ff49f6ad2cdea2c6d13e7da, Пользователь: Alexsandro, Серверы: Идентификатор: 5cc0e7b88f594602deecbeda, Пользователь: Энди, Серверы: Идентификатор: 5cc1cc852654795f801ccffc, Пользователь: Ansible, Серверы: и т. Д… Примечание PHP: Неопределенный индекс: имя хоста в ….