1

我正在尝试执行一个相当复杂的(对我而言)查询,该查询将从主表中获取描述字段,然后将其附加到相关查找表中的标题和值。并非所有记录在查找表中都有记录。我将提出进一步的问题作为后续问题,但要开始我的问题是,只有那些在所有表中具有值的记录才会显示。

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

  • (无效的)
  • 这是记录 2 文本

    颜色
    红色

    水果
    苹果
  • (无效的)

如果我使用 Concat_WS 我会得到所有记录,但 concat 中的“标签”会消失:

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

  • 这是记录 1 文本

    蓝色
  • 这是记录 2 文本


    苹果
  • 这是记录 3 文本


    葡萄

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

4

2 回答 2

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;

是一个 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

是一个说明这一点的 SQL Fiddle。只需删除distinct并查看结果的差异。

于 2018-03-18T14:47:52.587 回答
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 演示

编辑:

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

SET sql_mode=ONLY_FULL_GROUP_BY;
-- query will return error

J.Description' 不在 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;
于 2018-03-18T14:25:28.740 回答