Mysql 尝试从两个具有默认值的表中选择每个组合

Mysql 尝试从两个具有默认值的表中选择每个组合,mysql,sql,database,Mysql,Sql,Database,我的表结构如下所示: table a: id int name varchar table b: id int name varchar table c: id int valid tinyint table_a int table_b int 基本上,表c在表a和表b之间映射,并且还有一列用于确定某个内容是否有效(1或0)。我希望能够从表a中选择每个名称(仅一次),从表c中选择链接的“有效”列(如果不存在,则默认为0),并通过将表b与id匹配来限制它。希望这是有意义的 以下是一些示例数

我的表结构如下所示:

table a:
id int
name varchar

table b:
id int
name varchar

table c:
id int
valid tinyint
table_a int
table_b int
基本上,表c在表a和表b之间映射,并且还有一列用于确定某个内容是否有效(1或0)。我希望能够从表a中选择每个名称(仅一次),从表c中选择链接的“有效”列(如果不存在,则默认为0),并通过将表b与id匹配来限制它。希望这是有意义的


以下是一些示例数据,有助于说明我的意思:

使用上述表格结构,我得到以下数据:

Table a:
(id, name)
1, row 1
2, row 2
3, row 3

Table b:
(id, name)
1, row a
2, row b

Table c:
(id, valid, table_a, table_b)
1, 1, 1, 1
现在,我要选择的是表a中的所有名称,c中的“valid”列(如果没有匹配的行,则默认为0),并将“valid”字段限制为表_b=1中的字段。希望这更有意义

因此,我想返回以下,其中b.id=1:

(a.name, c.valid)
row 1, 1
row 2, 0
row 3, 0
选择
a、 名字,
IFNULL(c.valid,0)作为有效
从…起
A.
a.id=c.table_a上的左连接c
哪里
c、 表b=
或c。表_b为空
;
选择
a、 名字,
IFNULL(c.valid,0)作为有效
从…起
A.
a.id=c.table_a上的左连接c
哪里
c、 表b=
或c。表_b为空
;

希望查询是自我解释的:

SELECT * 
FROM 
  a LEFT OUTER JOIN c ON a.id = c.table_a 
    LEFT OUTER JOIN b ON c.table_b = b.id
WHERE c.valid = 1

希望查询是自我解释的:

SELECT * 
FROM 
  a LEFT OUTER JOIN c ON a.id = c.table_a 
    LEFT OUTER JOIN b ON c.table_b = b.id
WHERE c.valid = 1

让我看看我是否拿到了。你在找这样的东西吗

此查询:

select a.name, coalesce(c.valid, 0) as IsValid, b.id from a
left join c on a.id = c.table_a
left join b on b.id = c.table_b
结果如下:

NAME    ISVALID ID
row 1   1       1
row 2   0   
row 3   0   
如果您想要全部
b.id=1
,那么您将不会拥有表a中的所有行

select a.name, coalesce(c.valid, 0) as IsValid from a
left join c on a.id = c.table_a
left join b on b.id = c.table_b
where b.id = 1

NAME    ISVALID ID
row 1   1       1

让我看看我是否拿到了。你在找这样的东西吗

此查询:

select a.name, coalesce(c.valid, 0) as IsValid, b.id from a
left join c on a.id = c.table_a
left join b on b.id = c.table_b
结果如下:

NAME    ISVALID ID
row 1   1       1
row 2   0   
row 3   0   
如果您想要全部
b.id=1
,那么您将不会拥有表a中的所有行

select a.name, coalesce(c.valid, 0) as IsValid from a
left join c on a.id = c.table_a
left join b on b.id = c.table_b
where b.id = 1

NAME    ISVALID ID
row 1   1       1

对我来说,这不会返回表a中的整组行,只返回表c中有一行将它们链接在一起的行。对我来说,这不会返回表a中的整组行,只返回表c中有一行将它们链接在一起的行。这只返回valid为1的所有行。这只返回valid为1的所有行。这不会根据表b的id限制结果。但是,即使添加了where子句,我也只能从a中获取一些行,其中c中定义了一个链接。是的,在添加where子句之后,我只能从表a中获取在表c中具有映射的行。我还需要其他没有映射的行。好的,如上所述创建表结构并添加以下数据:
表a:(id,名称)1,第12行,第23行,第3行表b:(id,名称)1,第A2行,第b行表c:(id,有效,表a,表b)1,1,1,1
现在,我要选择的是表a中的所有名称,c中的“valid”列(如果没有匹配的行,则默认为0),并仅将“valid”字段限制为那些表_b=1的字段。希望这更有意义?这不会限制表b id的结果。但是,即使添加了where子句,我也只能从a中获取一些行,其中c中定义了一个链接。是的,在添加where子句之后,我只能从表a中获取在表c中具有映射的行。我还需要其他没有映射的行。好的,如上所述创建表结构并添加以下数据:
表a:(id,名称)1,第12行,第23行,第3行表b:(id,名称)1,第A2行,第b行表c:(id,有效,表a,表b)1,1,1,1
现在,我要选择的是表a中的所有名称,c中的“valid”列(如果没有匹配的行,则默认为0),并仅将“valid”字段限制为那些表_b=1的字段。希望这更有意义?