我正在尝试执行一个相当复杂的(对我来说)查询,该查询将从主表中获取Description字段,然后使用相关查找表中的标题和值附加它。并非所有记录都在查找表中都有记录。我将继续提出问题作为后续问题,但是开始我的问题是只显示所有表格中包含值的记录。
http://sqlfiddle.com/#!9/09047/13
如果我使用Concat_WS,我会收到所有记录,但我的标签是'在concat中消失了:
http://sqlfiddle.com/#!9/09047/16
所以我的第一步是获取所有记录描述,无论它们存在多少查找表,并显示名称/标签。
答案 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;