【问题标题】:How to correctly use group_concat to concatenate Join query result in MYSQL?如何正确使用 group_concat 连接 MYSQL 中的 Join 查询结果?
【发布时间】:2020-07-29 06:05:49
【问题描述】:

我写了下面的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_CONCATCOALESCE

【问题讨论】:

    标签: mysql join select inner-join coalesce


    【解决方案1】:

    您的查询缺少GROUP BY 子句;你需要GROUP BY p.server。请注意,您的COALESCE 实际上并没有做任何事情,因为如果值为NULL,您没有提供要替换的值,所以您最好将其省略(因为GROUP_CONCAT 忽略NULL 值,当vmtable.resNULL 时,这将防止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 之外。

    【讨论】:

      猜你喜欢
      • 2021-03-22
      • 2018-05-12
      • 1970-01-01
      • 2011-08-16
      • 2018-12-12
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多