尝试使用默认值从两个表中选择每个组合

时间:2012-02-12 13:49:54

标签: 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),并通过将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

3 个答案:

答案 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