我的表结构如下:
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)并通过将 table_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 中的“有效”列(如果没有匹配的行,则默认为 0)并将“有效”字段限制为 table_b = 1 . 希望这更有意义?
所以,我想返回以下 b.id = 1 的地方:
(a.name, c.valid)
row 1, 1
row 2, 0
row 3, 0
最佳答案
让我看看我是否明白了。您正在寻找这样的东西吗?
这个查询:
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
,那么您将不会拥有来自 table_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
关于mysql - 尝试从具有默认值的两个表中选择每个组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9249276/