Как правильно использовать group_concat для объединения результатов запроса Join в MYSQL? - PullRequest
0 голосов
/ 16 апреля 2020

Я написал следующий запрос MYSQL и версия Mysql: 8.0.18-commercial

SELECT p.server, 'Type_ABC' AS Check_Type, COALESCE(vmtable.res) AS result
FROM server p 
INNER JOIN truns t ON t.oq_id = p.oq_id
AND t.id = (SELECT t2.id FROM truns t2 WHERE t2.oq_id = p.oq_id order by t2.created_at desc limit 1 )
INNER JOIN qvuln_info vmtable ON vmtable.run_id = t.id 
LEFT JOIN qvuln_info_data vmtableinfo ON vmtableinfo.qid = vmtable.qid   
WHERE p.server regexp 'server1';

Я получаю следующий вывод из вышеприведенного запроса:

Hostname   Check_Type result
server1    Type_ABC   Result 1
server1    Type_ABC   Result 2
server1    Type_ABC   Result 3
server1    Type_ABC   Result 4

Я хочу объединить результаты, чтобы выходные данные выглядели следующим образом:

Hostname   Check_Type  result
server1    Type_ABC    Result 1,,Result 2,,Result 3,,Result 4

Для достижения указанного выше результата я написал следующий запрос, но он выдает синтаксическую ошибку:

SELECT p.server, 'Type1' AS Check_Type, 
GROUP_CONCAT((COALESCE(vmtable.res) AS result) SEPARATOR ', ')
FROM server p 
INNER JOIN truns t ON t.oq_id = p.oq_id
AND t.id = (SELECT t2.id FROM truns t2 WHERE t2.oq_id = p.oq_id order by t2.created_at desc limit 1 )
INNER JOIN qvuln_info vmtable ON vmtable.run_id = t.id 
LEFT JOIN qvuln_info_data vmtableinfo ON vmtableinfo.qid = vmtable.qid   
WHERE p.server regexp 'server1';

Как правильно использовать GROUP_CONCAT с COALESCE?

1 Ответ

1 голос
/ 16 апреля 2020

В вашем запросе отсутствует предложение GROUP BY; вам нужно GROUP BY p.server. Обратите внимание, что ваш COALESCE на самом деле ничего не делает, так как вы не предоставили значение для замены, если оно равно NULL, так что вы можете не указывать его (поскольку GROUP_CONCAT игнорирует значения NULL, это предотвратит появление любых значений в result, когда vmtable.res равно NULL). Ваш запрос должен выглядеть следующим образом:

SELECT p.server, 'Type1' AS Check_Type, 
       GROUP_CONCAT(vmtable.res SEPARATOR ', ') AS result
FROM server p 
INNER JOIN truns t ON t.oq_id = p.oq_id
AND t.id = (SELECT t2.id FROM truns t2 WHERE t2.oq_id = p.oq_id order by t2.created_at desc limit 1 )
INNER JOIN qvuln_info vmtable ON vmtable.run_id = t.id 
LEFT JOIN qvuln_info_data vmtableinfo ON vmtableinfo.qid = vmtable.qid   
WHERE p.server regexp 'server1'
GROUP BY p.server

Также обратите внимание, что AS result должно быть за пределами GROUP_CONCAT.

...