如何正确使用 group_concat 连接 MYSQL 中的 Join 查询结果?
How to correctly use group_concat to concatenate Join query result in MYSQL?
我编写了以下 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
?
您的查询缺少 GROUP BY
子句;你需要GROUP BY p.server
。请注意,您的 COALESCE
实际上并没有做任何事情,因为如果值为 NULL
,您还没有提供要替换的值,所以您最好将其省略(因为 GROUP_CONCAT
忽略 NULL
值,当 vmtable.res
为 NULL
时,这将防止任何值出现在 result
中)。您的查询应如下所示:
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
之外。
我编写了以下 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
?
您的查询缺少 GROUP BY
子句;你需要GROUP BY p.server
。请注意,您的 COALESCE
实际上并没有做任何事情,因为如果值为 NULL
,您还没有提供要替换的值,所以您最好将其省略(因为 GROUP_CONCAT
忽略 NULL
值,当 vmtable.res
为 NULL
时,这将防止任何值出现在 result
中)。您的查询应如下所示:
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
之外。