mysql使用指示列连接
我已经编写了以下mysql查询mysql使用指示列连接,mysql,sql,Mysql,Sql,我已经编写了以下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 当连接条件不满足时,是否有一种方法可以避免返回任何结果 编辑: 意识到此查询只返回一个行结果。我想要的结果集是列出所
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您可以在查询末尾添加HAVING子句,例如
HAVING checked > 0
请注意,由于查询中没有GROUPBY子句,因此查询最多返回一行。这是一个有效的SQL语句,但它返回一个奇怪的结果,因为这个结果集满足一个非常不寻常的用例
删除COUNT聚合也会阻止返回一行,但该语句也可能返回多行。还不完全清楚您希望返回什么结果集
后续行动
问:我想要的结果是列出所有可用的类型,并用一列指示特定系列是否具有该类型
答:但这与OP查询返回的结果完全不同
对于这样的结果,如果使用联接操作在类型中存在唯一的列或列组合,则从类型返回所有行的通常模式是:
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在类型表中是唯一的,那么g.foo可以从GROUPBY子句中省略。
这是正常的模式
如果您想省略seriesgree中没有匹配行的行,那么只需删除LEFT关键字,使连接操作成为内部连接而不是外部连接
如果保证genreid,seriesid元组是唯一的,我们可以消除GROUP BY子句,因为我们可以保证连接操作将从seriesGene表返回最多一个匹配行,例如
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在类型中不唯一,或者没有一组列使类型中的行唯一,那么我们需要避免使用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
如果要排除SeriesGene中没有匹配行的行,请再次使用相关子查询:
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
如果不满足条件,您希望查询不会给出任何结果吗?我希望的结果是列出所有可用的类型,并用一列指示特定系列是否具有该类型。