多个表连接Group_Concat,其中一些记录不存在于所有表中

时间:2018-03-18 14:19:29

标签: mysql sql join group-concat concat-ws

我正在尝试执行一个相当复杂的(对我来说)查询,该查询将从主表中获取Description字段,然后使用相关查找表中的标题和值附加它。并非所有记录都在查找表中都有记录。我将继续提出问题作为后续问题,但是开始我的问题是只显示所有表格中包含值的记录。

http://sqlfiddle.com/#!9/09047/13

  • (空)
  • 这是记录2文字

    颜色
    红色

    水果
    苹果
  • (空)

如果我使用Concat_WS,我会收到所有记录,但我的标签是'在concat中消失了:

http://sqlfiddle.com/#!9/09047/16

  • 这是记录1文字


  • 这是记录2文本

    红色的Apple
  • 这是记录3文本


    葡萄

所以我的第一步是获取所有记录描述,无论它们存在多少查找表,并显示名称/标签。

2 个答案:

答案 0 :(得分:1)

我认为concat_ws()可能会抛弃您想要做的事情。

以下产生两个标签,即使没有值:

Select J.id, 
       Concat(J.Description,
              '<br><br>',
              '<b>Color</b>:<br>',
              coalesce(group_concat(F.Name SEPARATOR '<br>'), ''),
              '<br>',
              '<b>Fruit</b>:<br>',
              coalesce(group_concat(F2.Name SEPARATOR '<br>'), '')
             )
from Main J Left Join
     LUT_1 L
     On J.ID = L.MainID Left Join
     LUT_Names_1 F
     On F.ID = L.LUT_NAME_ID Left Join
     LUT_2 L2
     On J.ID = L2.MainID Left Join
     LUT_Names_2 F2
     On F2.ID = L2.LUT_NAME_ID
Group by J.ID, J.Description;

Here是一个SQL小提琴。

此外,如果您有多种水果或颜色,您将获得重复。因此,您需要distinct关键字(或沿每个维度预先聚合)。所以工作SQL更像是这样:

Select J.id, 
       Concat(J.Description,
              '<br><br>',
              '<b>Color</b>:<br>',
              coalesce(group_concat(distinct F.Name SEPARATOR '<br>'), ''),
              '<br>',
              '<b>Fruit</b>:<br>',
              coalesce(group_concat(distinct F2.Name SEPARATOR '<br>'), '')
             )
from Main J Left Join
     LUT_1 L
     On J.ID = L.MainID Left Join
     LUT_Names_1 F
     On F.ID = L.LUT_NAME_ID Left Join
     LUT_2 L2
     On J.ID = L2.MainID Left Join
     LUT_Names_2 F2
     On F2.ID = L2.LUT_NAME_ID
Group by J.ID, J.Description

Here是一个SQL小提琴,它说明了这一点。只需删除distinct,然后查看结果中的差异。

答案 1 :(得分:0)

看起来你需要COALESCE

Select J.id, 
  Concat(J.Description,
    COALESCE(Concat('<b>Color</b>:<br>',
         group_concat(F.Name SEPARATOR '<br>')),''),
    '<br>',
    COALESCE(Concat('<b>Fruit</b>:<br>',
         group_concat(F2.Name SEPARATOR '<br>')),'')

  ) AS output
from Main J
Left Join LUT_1 L          On J.ID=L.MainID
Left Join LUT_Names_1 F    On F.ID=L.LUT_NAME_ID
Left Join LUT_2 L2         On J.ID=L2.MainID
Left Join LUT_Names_2 F2   On F2.ID=L2.LUT_NAME_ID
Group by J.ID;

<强> SQLFiddle Demo

修改

与MySQL一样,查询本身基于MySQL扩展。如果将其设置为ONLY_FULL_GROUP_BY(MySQL 5.7.5及更高版本的默认值):

SET sql_mode=ONLY_FULL_GROUP_BY;
-- query will return error
  

J.Description&#39;不在GROUP BY

要纠正这个问题,您需要在该列上使用聚合函数,如:MAX:

SET sql_mode=ONLY_FULL_GROUP_BY;

Select J.id, 
Concat(MAX(J.Description),
  COALESCE(Concat('<b>Color</b>:<br>',
         group_concat(F.Name SEPARATOR '<br>')),''),
  '<br>',
  COALESCE(Concat('<b>Fruit</b>:<br>',
         group_concat(F2.Name SEPARATOR '<br>')),'')

)
from Main J
Left Join LUT_1 L          On J.ID=L.MainID
Left Join LUT_Names_1 F    On F.ID=L.LUT_NAME_ID
Left Join LUT_2 L2         On J.ID=L2.MainID
Left Join LUT_Names_2 F2   On F2.ID=L2.LUT_NAME_ID
Group by J.ID;