mysql与指示列连接

时间:2014-09-08 15:20:34

标签: 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

有没有办法可以避免在不符合连接条件时返回任何结果?

编辑:

意识到此查询仅返回一个划行的结果。我想要的结果集是列出所有类型的列,指示特定系列是否具有该类型。 (上面使用的指标是0,1)

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