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 当连接条件不满足时,是否有一种方法可以避免返回任何结果 编辑: 意识到此查询只返回一个行结果。我想要的结果集是列出所

我已经编写了以下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

您可以在查询末尾添加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

如果不满足条件,您希望查询不会给出任何结果吗?我希望的结果是列出所有可用的类型,并用一列指示特定系列是否具有该类型。