2011-08-24 90 views
0

不太清楚如何解决这个问题,因为我的知识是有限的。MySQL中的where子句加入吗?

但是 - 我有三张桌子。

类别表。

category_id, category_name 
1   | ABC 
2   | DEF 
3   | GHI 

链接表。

link_id, category_id, link_name 
1  | 1   | Bla 
2  | 1   | Bla bla 
3  | 2   | Bla Bla Bla 

一个细节表

details_id, link_id, details_status (then some more irrelevant fields) 
1   | 1  | 0 
2   | 1  | 1 
3   | 1  | 0 
4   | 2  | 1 
5   | 3  | 1 

状态字段为0,1或2

我想什么做的是选择一个链接列表,给定类别。够简单。

然后我想要做的是加入详细信息表,这样我可以突出显示我的链接,如果找到给定的状态。

例如,在运行查询返回类别'ABC'的链接列表的情况下,detail_id的1和3属于状态0。

我的查询将返回象的状态where details_status=0

计数的东西所以对于CATEGORY_ID 1我想获得: link_id,LINK_NAME,status_count

产量:

1 | bla   | 2 
2 | bla bla  | 0 
3 | bla bla bla | 0 

回答

2
select links.link_id, links.link_name, 
     sum(if(details.details_status=0,1,0)) as status_count 
from links 
inner join category on links.category_id = category.category_id 
inner join details on details.link_id = links.link_id 
where category.category_name = 'ABC' 
group by links.link_id, links.link_name 

IF语句包含3个参数。第一个是被评估的逻辑表达式。第二个是返回值,如果该表达式为真。第三个是返回值,如果该表达式为false。所以,在这里,我们正在检查detail_status是否为0.如果是,我们要返回1,否则返回0.然后,我们将它包含在SUM函数中以获得我们正在查找的总计。

+0

谢谢,这工作!你能解释这部分吗,所以我可以完全理解,并希望将来再次使用它,我不确定0,1,0在做什么。 sum(if(details.details_status = 0,1,0)) – user887515

+0

see edited post –

1

听起来像类别表与您的问题无关。

实现你的要求的输出,试试这个:

select l.link_id, link_name, count(d.link_id) 
from links l 
left join details d on d.link_id = l.link_id and details_status = 0 
group by 1, 2; 

的钥匙,使这项工作是把details_status = 0on条款,where条款。

如果您愿意,您可以很容易地将此​​查询加入到类别表中。