我有一张比赛成绩表。并非所有的竞争对手都参加每场比赛,但是我想提供一个表格,该表格显示他们未参加的那些比赛,并在结果栏中输入空格和连字符“-”。
例如,竞争对手“约翰·史密斯”在2004年或2005年都没有参加比赛,但是我希望打印这些事件,即使他的名字没有出现在数据库中那些比赛的记录中
我只希望在种族系列(“ srs”)和他至少参加该年系列比赛的一场比赛的年份中发生。因此,他在2003年没有参加任何比赛,所以连连字符都没有显示。
到目前为止,我已经生成了这段代码,但是它没有按预期的方式工作-它既包括竞争对手的结果,也包括他参加比赛的连字符。
以下内容应有助于说明我要实现的结果结构的类型:
我尝试使用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
答案 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语句未经测试,可能存在一些问题。