我有一个如下表结构:
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中的“valid”列(如果没有匹配的行,则默认为0),并且仅将那些“有效”字段限制为table_b = 1希望这更有意义吗?
所以,我要回到以下b.id = 1:
(a.name, c.valid)
row 1, 1
row 2, 0
row 3, 0
答案 0 :(得分:0)
SELECT
a.name,
IFNULL(c.valid,0) AS valid
FROM
a
LEFT JOIN c on a.id=c.table_a
WHERE
c.table_b=<your-id-as wanted>
OR c.table_b IS NULL
;
答案 1 :(得分:0)
希望查询是自我解释的:
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
答案 2 :(得分: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