Групповое объединение с 2 таблицами с условиями

#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: Неопределенный индекс: имя хоста в ….