我编写了以下mysql查询
select g.*, (case when count(sg.seriesid) > 0 then 1 else 0 end) as checked
from genre g
join seriesgenre sg on sg.genreid = g.id and sg.seriesid = 1;
查询结果为null | null | 0
有没有办法可以避免在不符合连接条件时返回任何结果?
编辑:
意识到此查询仅返回一个划行的结果。我想要的结果集是列出所有类型的列,指示特定系列是否具有该类型。 (上面使用的指标是0,1)
答案 0 :(得分:0)
您可以在查询末尾添加HAVING子句,例如
HAVING checked > 0
请注意,由于查询中没有GROUP BY
子句,查询最多只返回一行。这是一个有效的SQL语句,但它返回一个奇怪的结果,因为这是一个非常不寻常的用例,这个结果集满足。
(删除COUNT()聚合也会阻止返回一行,但是该语句也可能会返回多行。还不完全清楚你想要返回什么结果集。)
<强>后续强>
问:我想要的结果是列出所有可用的流派,其中的列指示特定系列是否具有该流派。
答:但这与OP查询返回的结果完全不同。
这样的结果的通常模式是,使用JOIN操作从类型返回“所有”行(假设genre
中的列或列的组合是唯一的)将是:
SELECT g.id
, g.foo
, sg.genreid IS NULL AS checked
FROM genre g
LEFT
JOIN seriesgenre sg
ON sg.genreid = g.id
AND sg.seriesid = 1
GROUP
BY g.id
, g.foo
如果id
表中的genre
是唯一的,则可以从g.foo
子句中省略GROUP BY
。
这是正常模式。
如果要省略genre
中没有匹配行的行中的行,则只需删除LEFT
关键字,使连接操作成为“内部”连接,而不是“外“加入。
如果保证(genreid,seriesid)
元组是唯一的,我们可以消除GROUP BY
子句,因为我们可以保证JOIN操作最多可以从seriesgenre表返回一个匹配的行,例如
SELECT g.id
, g.foo
, sg.genreid IS NULL AS checked
FROM genre g
LEFT
JOIN seriesgenre sg
ON sg.genreid = g.id
AND sg.seriesid = 1
在更一般的情况下,如果id
中的genre
不是唯一的,或者genre
中的行没有唯一的列,那么我们需要避免使用GROUP BY
子句折叠行,并使用相关子查询而不是JOIN操作:
SELECT g.id
, g.foo
, IFNULL( SELECT 1
FROM seriesgenre sg
WHERE sg.genreid = g.id
AND sg.seriesid = 1
LIMIT 1
),0) AS checked
FROM genre g
如果我们想要排除seriesgenre
中没有匹配行的行,请再次使用相关子查询:
SELECT g.id
, g.foo
, ( SELECT 1
FROM seriesgenre sg
WHERE sg.genreid = g.id
AND sg.seriesid = 1
LIMIT 1
) AS checked
FROM genre g
HAVING checked = 1