在选择查询中,包含未找到直接结果的占位符结果

时间:2019-02-11 13:58:02

标签: mysql

我有一张比赛成绩表。并非所有的竞争对手都参加每场比赛,但是我想提供一个表格,该表格显示他们未参加的那些比赛,并在结果栏中输入空格和连字符“-”。

例如,竞争对手“约翰·史密斯”在2004年或2005年都没有参加比赛,但是我希望打印这些事件,即使他的名字没有出现在数据库中那些比赛的记录中

我只希望在种族系列(“ srs”)和他至少参加该年系列比赛的一场比赛的年份中发生。因此,他在2003年没有参加任何比赛,所以连连字符都没有显示。

到目前为止,我已经生成了这段代码,但是它没有按预期的方式工作-它既包括竞争对手的结果,也包括他参加比赛的连字符。

以下内容应有助于说明我要实现的结果结构的类型:

a busy cat

我尝试使用UNION显示查询。我想(希望)错过了一个小把戏。

select series as srs, 
year as yr, 
concat(year,series) as yrsrs, 
concat(year,series,round) as yrsrsrd, 
round, 
venue,
result
from races
where competitor = "John Smith"
group by yrsrsrd limit 200
UNION
select series as srs, 
year as yr, 
concat(year,series) as yrsrs, 
concat(year,series,round) as yrsrsrd, 
round, 
venue,
case when competitor <> "John Smith" then "-" else result end
from races
group by yrsrsrd order by 2, 1, 5 limit 200

2 个答案:

答案 0 :(得分:2)

您只需要查询的第二部分,但需要更改结果的计算。

Tag

现在从内到外看这行:

select series as srs, 
year as yr, 
concat(year,series) as yrsrs, 
concat(year,series,round) as yrsrsrd, 
round, 
venue,
coalesce(sum(case when competitor = "John Smith" then result end), "-") as result
from races
group by yrsrsrd 
order by 2, 1, 5
limit 200

CASE表达式将仅为John Smith返回结果。对于同一组(种族)中的所有其他行,它将为NULL。 SUM函数将忽略所有NULL并仅保留J.S.如果J.S.尚未参加该比赛,SUM的所有元素都将为NULL,因此SUM将返回NULL。最后,COALESCE会将NULL转换为“-”。

答案 1 :(得分:0)

您可以使用mysql COALESCE函数: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#function_coalesce

此功能将帮助您设置占位符值。 (例如:COALESCE(result,'-')

使用join语句,您可以执行以下操作:

SELECT 
year,
yrsrs,
yrsrsrd,
round, 
venue,
COALESCE(result,'-') as result
FROM (
    SELECT year as yr, concat(year,series) as yrsrs, concat(year,series,round) as yrsrsrd, round, venue 
    FROM races
    GROUP BY yrsrsrd order by 2, 1, 5 limit 200
) a 
LEFT JOIN (
    SELECT result, concat(year,series,round) as yrsrsrd 
    FROM races 
    WHERE competitor = "John Smith"
) b 
ON a.yrsrsrd = b.yrsrsrd

免责声明:此SQL语句未经测试,可能存在一些问题。