gpt4 book ai didi

mysql 连接带有指示列

转载 作者:行者123 更新时间:2023-11-29 23:49:21 24 4
gpt4 key购买 nike

我编写了以下 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 |空 | 0

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

编辑:

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

最佳答案

您可以在查询末尾添加 HAVING 子句,例如

HAVING checked > 0

请注意,由于查询中没有 GROUP BY 子句,因此查询最多将返回一行。这是一个有效的 SQL 语句,但它返回一个奇怪的结果,因为该结果集满足的是一个非常不寻常的用例。

(删除 COUNT() 聚合也会阻止返回一行,但该语句也可能返回多行。尚不完全清楚您想要返回什么结果集。)

<小时/>

跟进

问:我想要的结果是列出所有可用的类型,并用一列指示特定系列是否具有该类型。

答:但这与 OP 查询返回的结果完全不同。

对于这样的结果,使用 JOIN 操作返回流派中的“所有”行(假设流派中有一列或列的组合是唯一的)的通常模式是:

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

如果 idgenre 表中是唯一的,则可以从 GROUP BY 中省略 g.foo > 条款。这是正常的模式。

如果您想忽略 genre 中在系列流派中没有匹配行的行,则只需删除 LEFT 关键字即可使连接操作成为“内部连接” “连接而不是“外部”连接。

如果保证(genreid,seriesid)元组是唯一的,我们可以消除GROUP BY子句,因为我们可以保证JOIN操作将从系列流派表中最多返回一个匹配行,例如

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
<小时/>

在更一般的情况下,如果idgenre中不是唯一的,或者没有一组列可以在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

关于mysql 连接带有指示列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25727625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com